Описание
В вашем выражении взгляд aheads как (?=.*[A-Z]{1,})
тестируют, чтобы увидеть, если у вас есть 1 или более A-Z
, Они вернут true, если у вас есть любое число (больше нуля) желаемого класса символов. Продолжая тестирование, чтобы увидеть, есть ли более одного совпадения, просто избыточно.
^(?=(?:[^a-z]*?[a-z]){1})(?=(?:[^0-9]*?[0-9]){1})(?=(?:[^A-Z]*?[A-Z]){1})(?=(?:[^!-\/:[email protected][-
{- ~] *? [- /: - @ [- {-~]){1})[a-zA-Z0-9!-\/:[email protected][-
{- ~] {16,25} $ `
** Для того, чтобы увидеть изображение лучше, просто кликните правой кнопкой мыши на изображение и выберите пункт Открыть в новом окне
Это регулярное выражение будет делать следующее:
- требуют строку быть 16-25 длиной
- требует, по крайней мере, 1
a-z
символов в любом месте строки
- требует по крайней мере 1
A-Z
символов в любом месте строки
- требует, по крайней мере, 1
0-9
символов в любом месте строки
- требует, по крайней мере, 1 символ в любом месте строки
- позволяют нулевые пространства
Пример
Демо
https://regex101.com/r/oS4mY2/3
Пример текста
Примечание последняя строка не соответствует, потому что он не имеет символ
aWoeed1#fde39393aii
aWoeed1#fde39393AII
aaaaaaaaaaaaaaaaa1A
Образец Матчи
MATCH 1
0. [0-19] `aWoeed1#fde39393aii`
MATCH 2
0. [20-39] `aWoeed1#fde39393AII`
Объяснение
NODE EXPLANATION
--------------------------------------------------------------------------------
^ the beginning of the string
--------------------------------------------------------------------------------
(?= look ahead to see if there is:
--------------------------------------------------------------------------------
(?: group, but do not capture (1 times):
--------------------------------------------------------------------------------
[^a-z]*? any character except: 'a' to 'z' (0 or
more times (matching the least amount
possible))
--------------------------------------------------------------------------------
[a-z] any character of: 'a' to 'z'
--------------------------------------------------------------------------------
){1} end of grouping
--------------------------------------------------------------------------------
) end of look-ahead
--------------------------------------------------------------------------------
(?= look ahead to see if there is:
--------------------------------------------------------------------------------
(?: group, but do not capture (1 times):
--------------------------------------------------------------------------------
[^0-9]*? any character except: '0' to '9' (0 or
more times (matching the least amount
possible))
--------------------------------------------------------------------------------
[0-9] any character of: '0' to '9'
--------------------------------------------------------------------------------
){1} end of grouping
--------------------------------------------------------------------------------
) end of look-ahead
--------------------------------------------------------------------------------
(?= look ahead to see if there is:
--------------------------------------------------------------------------------
(?: group, but do not capture (1 times):
--------------------------------------------------------------------------------
[^A-Z]*? any character except: 'A' to 'Z' (0 or
more times (matching the least amount
possible))
--------------------------------------------------------------------------------
[A-Z] any character of: 'A' to 'Z'
--------------------------------------------------------------------------------
){1} end of grouping
--------------------------------------------------------------------------------
) end of look-ahead
--------------------------------------------------------------------------------
(?= look ahead to see if there is:
--------------------------------------------------------------------------------
(?: group, but do not capture (1 times):
--------------------------------------------------------------------------------
[^!-\/:[email protected][-`{- any character except: '!' to '\/', ':'
~]*? to '@', '[' to '`', '{' to '~' (0 or
more times (matching the least amount
possible))
--------------------------------------------------------------------------------
[!-\/:[email protected][-`{-~] any character of: '!' to '\/', ':' to
'@', '[' to '`', '{' to '~'
--------------------------------------------------------------------------------
){1} end of grouping
--------------------------------------------------------------------------------
) end of look-ahead
--------------------------------------------------------------------------------
[a-zA-Z0-9!-\/:[email protected][- any character of: 'a' to 'z', 'A' to 'Z',
`{-~]{16,25} '0' to '9', '!' to '\/', ':' to '@', '['
to '`', '{' to '~' (between 16 and 25
times (matching the most amount possible))
--------------------------------------------------------------------------------
$ before an optional \n, and the end of the
string
Вы уверены, что модель работает на всех? Вы хотите потребовать от 1 до 8 * последовательных * более низких, прописных букв, цифр и символов? '. *' В начале делает недействительным просмотр проверки длины. Попробуйте ['^ (? = \ S {16,25} $) (? = (?: [^ Az] * [az]) {1,8}) (? = (?: [^ AZ] * [AZ ]) {1,8}) (= (:? \ D * \ г) {1,8}) (= (?:? \ ш * \ W) {1,8}) \ S * $ '] (https://regex101.com/r/fH8mF7/1), который позволяет от 1 до 8 символов, требуемых в любой строке. '\ S' следует использовать для запрета пробелов. –
Не было бы проще и (потенциально) более безопасным просто сказать 16-25 символов без пробелов, а не произвольно объявлять, что первый 1-8 должен быть в нижнем регистре, в следующем верхнем регистре, а затем цифры, а затем символы? Тогда вам просто нужно '/^[^ \ s] {16,25} $ /': https://xkcd.com/936/ – CD001
'/^[^ \ s] {16,25} $ /' позволил бы пароль, полный 'a''s –