Чтобы ответить на вопрос в заголовке, вот что не так с вашим регулярным выражением:
Во-первых, .*
(точка-звезда) в начале потребляет всю строку. Затем применяется первый запрос (?=.{6,})
, который завершается неудачно, поскольку совпадающая позиция находится в конце строки. Таким образом, механизм регулярных выражений начинает возвращаться назад, «забирая» символы, перемещая позицию совпадения назад на один символ за раз и повторно применяя просмотр. Когда возвращается шесть символов, первый взгляд успешно завершается, а следующий применяется.
Второй запрос - (?=[a-zA-Z]*)
, что означает «в текущей позиции совпадения попытаться сопоставить ноль или более букв ASCII». Позиция совпадения по-прежнему составляет шесть символов от конца строки, но это не имеет значения; независимо от того, применяете ли вы его, он всегда будет успешным, поскольку он может юридически соответствовать нулю символов. Кроме того, буквы могут находиться в любом месте строки, поэтому заглядывающая сторона должна учитывать все возможные промежуточные не-буквы.
Тогда у вас есть {2,}
. Это не часть подвыражения, потому что оно не в скобках. В этой позиции это означает, что оглядка должна быть успешной два или более раз, что не имеет смысла. Если это удалось один раз, то это будет успешное любое количество раз, потому что он применяется каждый раз в одной и той же позиции. Некоторые разновидности регулярных выражений воспринимают это как ошибку, когда вы применяете квантификатор к предпросмотру (или к любому другому утверждению нулевой ширины, например, разглядывание сзади, граница слова, якоря строк). Большинство ароматов, кажется, игнорируют квантификатор.
Тогда у вас есть еще один прогноз, который всегда будет успешным, и еще один бесполезный квантификатор. Наконец, точка-звезда в конце повторно потребляет шесть символов, от которых должна была отказаться первая точка-звезда.
Я думаю, это то, что вы пытались:
^
(?=.{6})
(?=(?:[^A-Za-z]*[A-Za-z]){2})
(?=(?:[^0-9@#$%^&+=]*[0-9@#$%^&+=]){2})
.*$