регулярное выражение для ограничения специальных символов, за исключением нескольких

#javascript #regex #regex-negation

Вопрос:

Я смог написать регулярное выражение для проверки приведенных ниже критериев для поля ввода.

  1. содержит не менее 14 символов
  2. содержит не менее 1 заглавной буквы (A-Z)
  3. содержит по крайней мере 1 простую букву (a-z)
  4. содержит по крайней мере 1 число (0-9)
  5. содержит по крайней мере 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))))