Это регулярное выражение, с которого вы начали, плохо.С одной стороны, JavaScript \W
эквивалентен [^A-Za-z0-9_]
: любой символ, который не является символом слова ASCII.Сюда входят все знаки препинания, пробелы и управляющие символы ASCII, а также все символы, не входящие в ASCII.Официального определения «специальных символов», о котором я знаю, нет, но я вполне уверен, что это не то, что имел в виду автор.
Для этого я предполагаю, что в ASCII допускаются только символы ASCII.пароль, и что «специальные символы» относится к символам пунктуации:
[!"#$%&'()*+,\-./:;<=>?@\[\\\]^_`{|}~]
Это будет регулярное выражение
^(?=[!-~]{6,20}$)(?=.*[A-Z])(?=.*[a-z])(?=.*[\d!"#$%&'()*+,\-./:;<=>?@\[\\\]^_`{|}~]).*$
Примечания:
Обратите внимание, как я вытащил ^
из первой группы;он здесь, чтобы привязать все регулярные выражения, а не только этот один взгляд.
Я также объединил «цифры» и «специальные» взгляды в одно целое.В этом случае это не имеет большого значения, но одно из моих правил состоит в том, что вы никогда не должны использовать чередование, если класс персонажей выполнит эту работу.
[!-~]
старыйPerl идиома для любого «видимого» символа ASCII (то есть, всего, кроме пробелов или управляющих символов).
Я не имею ни малейшего представления, что пытался сделать с этим оригинальный автор (?![.\n])
.