在某种程度上,我理解积极的前瞻。
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 个字符的字符串。
答案1
你的^(?:(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))(?!.*(.)\1{2,})
正则表达式等于
^(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9])(?!.*(.)\1{2,})`
请参阅正则表达式演示。
这里的前瞻要求在除换行符之外的任何零个或多个字符之后存在 ( ?=
) 或不存在 ( ) 特定模式。?!
这是一个典型的密码检查正则表达式。
它们在锚点、字符串开始之后使用^
,因为运行每个前向检查就足够了一次在字符串的开头。由于环视是零宽度断言,因此所有四个环视都在字符串开头一一触发。
它匹配
^
- 字符串的开头(?=.*\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 字母数字字符之外的任何字符。