我如何要求一个正则表达式中至少有两个前瞻模式匹配?

2023-12-19

以下正则表达式可确保密码至少包含 1 个小写字母、1 个大写字母、1 个数字和 1 个特殊字符:

^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[^a-zA-Z0-9\s]).*$

这样可行。在此基础上,我想要求只有满足其中两个组才能使密码有效。

例如,这些是有效的密码:aaaaa5、BFEWREWRE77、#2ccc。

有没有办法修改这个正则表达式来支持这个要求?


你可以这样做:

禁止使用空格:

^(?=([A-Z]+|[a-z]+|[0-9]+|[^a-zA-Z0-9\s]+))\1\S+$

允许有空格:

^\s*(?=((?:[A-Z]+\s*)+|(?:[a-z]+\s*)+|(?:[0-9]+\s*)+|(?:[^a-zA-Z0-9\s]+\s*)+))\1.+$

解释:

(?=([A-Z]+|[a-z]+|[0-9]+|[^a-zA-Z0-9\s]+))\1模仿原子团 http://www.regular-expressions.info/atomic.html (?>[A-Z]+|[a-z]+|[0-9]+|[^a-zA-Z0-9\s]+)。因此,一旦匹配了该组的一个分支,正则表达式引擎就不再允许在匹配的字符内回溯。

由于默认情况下量词是贪婪的,因此其中一个类别的所有字符都与原子组匹配。

下一个匹配的字符\S or .显然来自与组中使用的角色不同的角色类别。

注意:对于第二种模式,由于字符串中使用的字符没有限制,因此您不需要测试字符串直到末尾,因此您可以编写:

^\s*(?=((?:[A-Z]+\s*)+|(?:[a-z]+\s*)+|(?:[0-9]+\s*)+|(?:[^a-zA-Z0-9\s]+\s*)+))\1.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我如何要求一个正则表达式中至少有两个前瞻模式匹配? 的相关文章

随机推荐