Генерация строки на основе регулярных выражений с RandExp

1

Мне нужно создать строку на основе регулярного выражения, которая приведет к случайным буквам и цифрам, 4 штрихами в случайных местах в 36-символьной строке.

Пример:

123A5678-01B3C5F7-901R345-789F1-3456

Я вычислил регулярное выражение, которое, похоже, хорошо подтверждает данную строку:

(?=.{36}$)([0-9A-Z]+-){4}([0-9A-Z])+

... но используя то же самое для генерации строки в RandExp, оказывается в беспорядке. Он генерирует 36-символьную строку и добавляет 5 групп случайной длины:

new RandExp(/(?=.{36}$)([0-9A-Z]+-){4}([0-9A-Z])+/).gen()

M78QMOC6OGIF5OAJAJCG68CQWJGT5FX43CTKZ9CS9GXWLEKUKZMG602U5HPR4CEKO7OIX45CMLB7DS5RHZBI8KE8HGO9ET6OWS9A-PQSHN9E36KIMW328A1L0BHXCFOJVCD2ZT11-KD03XTZ375WP7CR7YSF4CTSX-0FBJ3MZ4RNDLA5UZOHI5QWVY66PTUDDRCG-OH4F688VM1

Должен ли я просто поселиться для групп фиксированной ширины для своей строки, используя что-то вроде:

([0-9A-Z]{6}-){4}[0-9A-Z]{8}

... или есть ли способ улучшить исходное регулярное выражение?

Теги:
string

1 ответ

1
Лучший ответ

Кажется невозможным использовать целую строку, ограничивающую просмотр с помощью Randexp. Я также попытался с вашим шаблоном, и он генерирует строку с n символами любого типа, например $>Qa MG4XT@#j{3#&[+V4=^"VQLI*|b%bp~@ (1).

Еще более странно, когда вы применяете привязки, new RandExp(/^(?=.{36}$)(?:[0-9A-Z]+-){4}[0-9A-Z]+$/) также будет создавать около ~ 30 символов различных типов в начале строки. Это может быть связано с тем, что $ не используется в конечной позиции шаблона и игнорируется (см. Плохие регулярные выражения). Это похоже на ошибку.

Удаление предпросмотра и добавление ^ пуск в струне якоря на старт и $ конца-строки якоре в конце делает его генерировать несколько лучшие строки (2). Однако вы действительно можете использовать только группы фиксированной длины (3).

document.body.innerHTML = "(1) " + new RandExp(/(?=.{36}$)([0-9A-Z]+-){4}([0-9A-Z])+/).gen();
document.body.innerHTML += "<br/><br/>(2)&nbsp;" + new RandExp(/^(?:[0-9A-Z]+-){4}[0-9A-Z]+$/).gen();
document.body.innerHTML += "<br/><br/>(3)&nbsp;" + new RandExp(/^(?:[0-9A-Z]{6}-){4}[0-9A-Z]{8}$/).gen();
<script src="https://github.com/fent/randexp.js/releases/download/v0.4.1/randexp.min.js"></script>

Затем вы можете попытаться обойти эту проблему, используя /^(?:[0-9A-Z]{6,8}-){4}[0-9A-Z]{6,8}$/ regex в и возвращает результат только в том случае, если длина строки составляет 36 символов:

var rdx = new RandExp(/^(?:[0-9A-Z]{6,8}-){4}[0-9A-Z]{6,8}$/);
var res = rdx.gen();
while (res.length !== 36) {
    res = rdx.gen();
}
document.body.innerHTML = res;
<script src="https://github.com/fent/randexp.js/releases/download/v0.4.1/randexp.min.js"></script>
  • 0
    Написав очень похожую библиотеку на это , я могу сказать: упреждения не поддерживаются библиотекой, потому что они «не совсем регулярные выражения». Их поддержка потребует использования совершенно другого алгоритма, и это может даже оказаться невозможным на 100%. Чтобы достичь того, чего изначально хотел OP, я бы порекомендовал, например, объединить RandExp с некоторой дополнительной логикой - например, сгенерировать строку из 36 символов и только затем заменить 4 случайных символа на - .
  • 0
    @ TomLord: Да, должна быть какая-то дополнительная логика. Я предложил быстрый обходной путь внизу ответа. Жаль, что в readme библиотеки не упоминается, что он не полностью совместим с JS regex.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню