Почему последовательные просмотры не всегда работают

#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.