在某种程度上,我理解积极的前瞻性。
X(?=Y),意思是“寻找X,但只有在Y之后才匹配”
但是在下面的正则表达式中 - 我不明白正则表达式开头的积极前瞻的意义。
^(?:(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))(?!.*(.)\1{2,})
有人可以解释一下积极的前瞻在开始时做了什么以及上面的正则表达式做了什么。
编辑-如果有帮助,这是整个正则表达式-
^(?:(?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))(?!.*(.)\1{2,})[A-Za-z0-9]{8,64}$
整个正则表达式应该匹配包含大写、小写、数字且长度为 8 到 64 个字符的字符的字符串。
你的
^(?:(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))(?!.*(.)\1{2,})
正则表达式等于请参阅正则表达式演示。
此处的前瞻要求在除换行符之外的任何零个或多个字符之后存在 (
?=
) 或不存在( ) 特定模式。?!
这是一个典型的密码检查正则表达式。它们在锚点之后使用,字符串的开头,因为在字符串的开头只运行一次
^
前瞻检查就足够了。由于lookarounds是零宽度断言,所有四个lookaheads都在字符串的开头一个接一个地触发。它匹配
^
- 字符串的开始(?=.*\d)
- 除换行符以外的任何零个或多个字符后必须至少有一位数字(?=.*[A-Z])
- 除换行符外,任何零个或多个字符后必须至少有一个大写 ASCII 字母(?=.*[^A-Za-z0-9])
- 在任何零个或多个除换行符之外的字符之后必须至少有一个除 ASCII 字母数字字符之外的字符(?!.*(.)\1{2,})
- 在除换行符之外的任何零个或多个字符之后,不应有 3 个或更多相同的连续字符(换行符除外)。有时,正则表达式函数需要完整的字符串匹配,因此
.*
可能需要在此模式的末尾。您的第二个正则表达式实际上等于
^(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?!.*(.)\1{2,})[A-Za-z0-9]{8,64}$
. 这是这个带有解释的正则表达式演示。所有替代品(?=.*[^A-Za-z0-9])
都不会匹配,因为消费模式部分 -[A-Za-z0-9]{8,64}
- 只匹配 ASCII 字母或数字,并且永远不会匹配除 ASCII 字母数字字符之外的任何字符。