Вы хотите:
/^(?=.{6,12}$)...
То, что вы делаете, говорит: найдите мне любую последовательность символов, за которой следует:
- 6-12 символов
- другая последовательность символов, за которой следуют 2 цифры
- другая последовательность символов, за которой следуют 2 заглавные буквы
- другая последовательность символов, за которой следуют 2 строчные буквы
И все это сопровождается еще одной последовательностью символов.Вот почему максимальная длина не работает, потому что 30 символов, за которыми следуют 00AAaa и еще 30 символов, будут проходить.
Также то, что вы делаете, это объединение двух чисел вместе .Чтобы быть менее строгим, но требовать по крайней мере двух чисел в любом месте строки:
/^(?=.{6,12}$)(?=(.*?\d){2})(?=(.*?[A-Z]){2})(?=(.*?[a-z]){2})/
Наконец, вы заметите, что я использую не жадные выражения (.*?
).Это позволит избежать много возвратов и для такого рода проверки вам следует использовать в целом.Разница между:
(.*\d){2}
и
(.*?\d){2}
В том, что первый захватит все символы с .*
, а затем будет искать цифру.Он не найдет его, потому что он будет в конце строки, поэтому он будет возвращать один символ и затем искать цифру.Если это не цифра, она будет возвращаться, пока не найдет ее.После этого он будет соответствовать всему этому выражению во второй раз, что вызовет еще больший возврат.
Вот что означает жадные символы .
Вторая версия пройдетноль символов до .*?
и искать цифру.Если это не цифра, .*?
будет захватывать другие символы, а затем искать цифру и так далее.В частности, для длинных строк поиска это может быть на несколько порядков быстрее.Для короткого пароля это почти наверняка не будет иметь значения, но это хорошая привычка - узнать, как работает сопоставитель регулярных выражений, и написать наилучшее регулярное выражение, которое вы можете.
При этом, вероятно, этопример того, чтобы быть слишком умным для вашего же блага.Если пароль отклонен как не соответствующий этим условиям, как вы определяете, какой из них оказался неудачным, чтобы дать отзыв пользователю о том, что исправить?На практике, вероятно, предпочтительнее программное решение.