#javascript #regex
#javascript #регулярное выражение
Вопрос:
Я хочу регулярное выражение, которое возвращает true, когда есть по крайней мере 5 символов и 2 цифры. Для этого я использую предварительный просмотр (т. е. (?=...)
).
// this one works
let pwRegex = /(?=.{5,})(?=D*d{2})/;
let result = pwRegex.test("bana12");
console.log("result", result) // true
// this one won't
pwRegex = /(?=.{5,})(?=d{2})/;
result = pwRegex.test("bana12");
console.log("result", result) // false
Почему нам нужно добавить D*
, чтобы это заработало?
Для меня d{2}
слабее, чем D*d{2}
, поэтому он не должен допускать принятия теста?
Комментарии:
1. Это для вызова в freeCodeCamp ;).
2. Но я должен признать, что это кажется удобным решением, чтобы сделать эти 2 предположения: я хочу 5 символов, и я хочу, чтобы в нем было 2 цифры. Как обойтись без предварительного просмотра?
Ответ №1:
Ваши предварительные просмотры проверяются только с текущей позиции соответствия. Поскольку вы ничего не сопоставляете, это означает, что с самого начала. Поскольку bana12
не начинается с двух цифр, d{2}
происходит сбой. Это так просто 😉
Также обратите внимание, что наличие d{2}
означает, что ваши цифры должны быть смежными. Это ваше намерение?
Чтобы просто потребовать 2 цифры, которые не обязательно должны быть смежными, попробуйте
/(?=.{5,})(?=D*dD*d)/
Комментарии:
1. Я отредактировал ответ, чтобы добавить закрывающую скобку
)
в предварительный просмотр.
Ответ №2:
Обратите внимание, что предварительные просмотры — это утверждения нулевой ширины, и когда их шаблоны совпадают, индекс регулярного выражения остается на том же месте, где он был раньше. Предварительные просмотры в приведенных выше шаблонах выполняются в одних и тех же местах.
/(?=.{5,})(?=d{2})/
Шаблон будет соответствовать местоположению, которое содержит любые 5 символов, отличных от символов разрыва строки, непосредственно справа от текущего местоположения, и первые 2 символа в этой подстроке из 5 символов являются цифрами.
Вам нужно добавить D*
, чтобы разрешить другие типы символов перед 2 цифрами.
Подробнее об этом поведении читайте в Lookarounds Stand their Ground.