У меня есть имя пользователя для проверки:
Я написал это регулярное выражение
^[a-zA-Z][^\W_]{2,}_?[a-zA-Z0-9]$
Но я действительно понятия не имею, как ограничить появление подчеркивания (0-1 раз).
Как я могу достичь своих требований?
Используйте просмотр вперед, чтобы проверить более конкретные квалификации, а затем примените общее правило \w{4,}
.
const tests = ['_und', 'u_nd', 'un_d', 'und_', 'u_n_', 'u__d', '8_no'];
for (i in tests) {
document.write(tests[i] + ' => ' + /^(?=[a-z][^_]*_?[^_]+$)\w{4,}$/i.test(tests[i]) + "<br>");
}
(?= #lookahead
[a-z] #a letter
[^_]* #zero or more non-underscores
_? #an optional underscore
[^_]+$ #one or more non-underscores until the end of the string
)
Это также можно сделать без просмотра вперед, но проверка длины 4 или более символов становится неявной, а не явной. Другими словами, люди, которые читают шаблон, должны будут определить минимальную длину строки, равную 4, путем понимания условных выражений и суммирования реализованных квантификаторов.
const tests = [
'und',
'_und',
'u_nd',
'un_d',
'und_',
'u_n_',
'u__d',
'8_no',
'u_derscore',
'un_erscore',
'und_rscore',
'unde_score',
'under_co_e',
'underscor_',
'_nderscore'
];
for (i in tests) {
document.write(tests[i] + ' => ' + /^[a-z](?:_[^\W_]{2,}|[^\W_]_[^\W_]+|[^\W_]{2,}_?[^\W_]+)$/i.test(tests[i]) + "<br>");
}
Авария:
/ #pattern delimiter
^ #start of string anchor
[a-z] #alphabetical character
(?: #non-capturing group
_[^\W_]{2,} #underscore, two or more alnum characters (at least 3 characters)
| #or
[^\W_]_[^\W_]+ #alnum character, underscore, one or more non-underscore (at least 3 characters)
| #or
[^\W_]{2,}_?[^\W_]+ #two or more alnum characters, optional underscore, one or more alnum characters (at least 3 characters)
) #end of non-capturing group
$ #end of string anchor
/ #pattern delimiter
i #case-insensitive pattern modifier
Ты спас мне жизнь. ХАХАХа, большое спасибо. Я даже не знаю, как использовать lookahead. Кстати, можно ли решить это без использования просмотра вперед?
но я думаю, может быть, лучше использовать [^\W_] для обозначения отсутствия подчеркивания лучше, чем [^_]? Потому что это может быть принято, если символ ., \ и т. д..
Упреждающий просмотр позволяет механизму регулярных выражений применять правила до фактического использования/сопоставления символов, а затем после того, как предварительный просмотр будет удовлетворен, механизм продолжит обход строки. Я обновляю свой ответ, чтобы включить шаблон без просмотра вперед, но он длиннее, и мне его труднее читать. Причина, по которой я использовал [^_]
в первом фрагменте, заключалась в том, что \w{4,}
применяла весь диапазон строковых символов.
Использование предпросмотра для обеспечения соблюдения правил надежности пароля очень распространено. Например: stackoverflow.com/a/43697894/2943403
Пожалуйста, предоставьте набор тестовых случаев и желаемый результат от каждого из них. Предоставление минимальный воспроизводимый пример важно.