Мне нужно создать строку на основе регулярного выражения, которая приведет к случайным буквам и цифрам, 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}
... или есть ли способ улучшить исходное регулярное выражение?
Кажется невозможным использовать целую строку, ограничивающую просмотр с помощью 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) " + new RandExp(/^(?:[0-9A-Z]+-){4}[0-9A-Z]+$/).gen();
document.body.innerHTML += "<br/><br/>(3) " + 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>
RandExp
с некоторой дополнительной логикой - например, сгенерировать строку из 36 символов и только затем заменить 4 случайных символа на-
.