以下正则表达式确保密码至少包含一个小写,一个大写,一个数字和一个特殊字符:
^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[^a-zA-Z0-9\s]).*$
有效。在此基础上,我想要求只有两个这样的组才能使密码有效。
例如,这些是有效密码:aaaaa5,BFEWREWRE77,#2ccc。
我是否可以修改此正则表达式以支持此要求?
答案 0 :(得分:3)
你可以这样做:
禁止使用空格:
^(?=([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
模仿atomic group (?>[A-Z]+|[a-z]+|[0-9]+|[^a-zA-Z0-9\s]+)
。因此,一旦该组的一个分支匹配,就不再允许正则表达式引擎在匹配的字符内回溯。
由于量词在默认情况下是贪婪的,因此其中一个类别的所有字符都与原子组匹配。
\S
或.
匹配的下一个字符显然来自与该组中使用的字符不同的字符类。
注意:对于第二种模式,由于对字符串中使用的字符没有限制,因此您不需要测试字符串直到结束,因此您可以写:
^\s*(?=((?:[A-Z]+\s*)+|(?:[a-z]+\s*)+|(?:[0-9]+\s*)+|(?:[^a-zA-Z0-9\s]+\s*)+))\1.
答案 1 :(得分:1)
因为你要求这个长正则表达式:
^(?:(?=.*[A-Z])(?=.*[a-z])|(?=.*[A-Z])(?=.*[0-9])|(?=.*[A-Z])(?=.*[^a-zA-Z0-9\s])|(?=.*[a-z])(?=.*[0-9])|(?=.*[a-z])(?=.*[^a-zA-Z0-9\s])|(?=.*[0-9])(?=.*[^a-zA-Z0-9\s])).+$
答案 2 :(得分:1)
大多数现代发动机都提供条件 这是一个简单的示例模式,禁止重新进入同一组 并保证X符合Y要求。
实质上,基于仅
,各组之间没有特定顺序匹配
量词编号 X ,这是导致对齐的标准。
它非常具有可扩展性,只需在交替中添加一个新组 设置 X 表示您要匹配的唯一组数。
这一个设置为4中的3个
只需完成任何边界要求即可完成
^
+ regex_below + .*$
。
此外,这会消耗殆尽。如果有的话,很容易在一个先行之内 是任何长度或其他特定属性。
请注意,如果引擎不支持条件(并非全部都支持),那么这将不起作用。
# (?:.*?(?>((?(1)(?!))[a-z]+)|((?(2)(?!))[A-Z]+)|((?(3)(?!))[0-9]+)|((?(4)(?!))[^a-zA-Z0-9\s]+))){3}
(?:
.*?
(?>
( # (1)
(?(1) (?!) )
[a-z]+
)
| ( # (2)
(?(2) (?!) )
[A-Z]+
)
| ( # (3)
(?(3) (?!) )
[0-9]+
)
| ( # (4)
(?(4) (?!) )
[^a-zA-Z0-9\s]+
)
)
){3}
X 为4(满分为4)时的示例输出
** Grp 0 - ( pos 0 , len 11 )
B,B_+&*%#a0
** Grp 1 - ( pos 9 , len 1 )
a
** Grp 2 - ( pos 0 , len 1 )
B
** Grp 3 - ( pos 10 , len 1 )
0
** Grp 4 - ( pos 1 , len 1 )
,
答案 3 :(得分:0)
你必须做类似的事情:
^(
(?=1)(?=2)
|
(?=1)(?=3)
|
(?=1)(?=4)
|
(?=2)(?=3)
|
(?=2)(?=4)
|
(?=3)(?=4)
).*$
其中1,2,3& 4是你的不同模式