Попробуйте это:
^(?=.*[a-z])(?=.*[A-Z])(?=.*[[email protected]#$&*])(?=.*[0-9]).{8,}$
Объяснение:
(?=.*[a-z])
пароль должен содержать строчную букву где-то.
(?=.*[A-Z])
пароль должен содержать прописную букву где-нибудь.
(?=.*[[email protected]#$&*])
пароль должен содержать символ где-то.
(?=.*[0-9])
пароль должен содержать цифру где-то.
Все они выглядят впереди, что означает каждый тест на что-то, не включив его в игру, или перемещая позицию спички вперед. Таким образом, после всех этих тестов мы все еще находимся в начале строки в отношении соответствия.
.{8,}
весь пароль должен содержать 8 или более символов. (^
и $
привязка к началу и концу строки, поэтому они гарантируют, что совпадение охватывает всю строку).
Проблема с оригиналом была [a-zA-Z1-9]{8,}
. Эта часть означала, что весь пароль должен состоять из восьми или более букв и цифр. Это противоречило более раннему требованию присутствия особого персонажа. Кроме того, оригинал не считал ноль числом, которое я считал довольно глупым.
Лично я бы запускал 4 простых теста, проще и так вы можете запросить у пользователя то, что не так с их выбором. –
Кроме того, я думаю, что, например, * «Это замечательный фрейм-код passphrase» * более безопасен и легче запоминается, чем, например, * «FooBar7 @» *. –