#javascript #regex #regex-negation
Вопрос:
Я смог написать регулярное выражение для проверки приведенных ниже критериев для поля ввода.
- содержит не менее 14 символов
- содержит не менее 1 заглавной буквы (A-Z)
- содержит по крайней мере 1 простую букву (a-z)
- содержит по крайней мере 1 число (0-9)
- содержит по крайней мере 1 специальный символ ( =!@#$%^amp;*)
Регулярное выражение -> ^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[ =!@#$%^amp;*])(?=\S $).{14,}$
Однако это регулярное выражение допускает другие специальные символы, которые не упоминаются. Я хочу ограничить все специальные символы, кроме этих =!@#$%^amp;*
может ли кто-нибудь помочь мне изменить данное регулярное выражение в соответствии с вышеуказанными критериями?
Ответ №1:
Вместо .
того, чтобы разрешать любой символ, вы можете использовать набор символов, чтобы ограничить разрешенные символы определенным набором:
^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[ =!@#$%^amp;*])(?=\S $)[0-9A-Za-z =!@#$%^amp;*]{14,}$
Ответ №2:
Почему бы не использовать наборы вместо регулярного выражения:
import string
upperSet = set(string.ascii_uppercase)
lowerSet = set(string.ascii_lowercase)
numberSet = set("0123456789")
specialSet = set(" =!@#$%^amp;*")
allSets = [upperSet,lowerSet,numberSet,specialSet]
validSet = set().union(*allSets)
isValid = len(pw)>=14 and validSet.issuperset(pw)
and all(s.intersection(pw) for s in allSets)
Вы также можете использовать метод translate для преобразования каждой группы символов в четыре кода, которые затем проверяются на точное присутствие в переведенной строке:
validCheck = str.maketrans(string.ascii_letters "0123456789" " =!@#$%^amp;*",
"1"*26 "2"*26 "3"*10 "4"*10)
isValid = len(pw)>=14 and set('1234') == set(pw.translate(validCheck))))