以下正则表达式可确保密码至少包含 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(使用前将#替换为@)