Regex 如何要求在一个正则表达式中至少有两个前瞻模式匹配?
以下正则表达式确保密码至少包含一个小写、一个大写、一个数字和一个特殊字符:Regex 如何要求在一个正则表达式中至少有两个前瞻模式匹配?,regex,lookahead,Regex,Lookahead,以下正则表达式确保密码至少包含一个小写、一个大写、一个数字和一个特殊字符: ^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[^a-zA-Z0-9\s]).*$ 这很有效。在此基础上,我想要求只有满足其中两个组才能使密码有效 例如,这些将是有效的密码:aaaaa5、bfewre77、#2ccc 是否有办法修改此正则表达式以支持此要求?您必须执行以下操作: ^( (?=1)(?=2) | (?=1)(?=3) | (?=1)(
^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[^a-zA-Z0-9\s]).*$
这很有效。在此基础上,我想要求只有满足其中两个组才能使密码有效
例如,这些将是有效的密码:aaaaa5、bfewre77、#2ccc
是否有办法修改此正则表达式以支持此要求?您必须执行以下操作:
^(
(?=1)(?=2)
|
(?=1)(?=3)
|
(?=1)(?=4)
|
(?=2)(?=3)
|
(?=2)(?=4)
|
(?=3)(?=4)
).*$
其中1、2、3和4是您的不同模式因为您要求使用这个长正则表达式:
^(?:(?=.*[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])).+$
您可以这样做: 禁止使用空间:
^(?=([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
模拟(?>[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.
大多数现代发动机都提供条件。
这是一个简单的示例模式,禁止重新进入同一组
并保证X/Y要求 本质上,这些组只基于
量词编号X,它是导致对齐的条件 它的可扩展性非常强,只需在备选方案中添加一个新组即可。
为要匹配的唯一组数设置X 这一项设置为4项中的3项。
然后用你的任何边界要求来结束它,比如
^
+regex\u以下+*$
而且,这会随着时间的推移而消耗。如果有,它可能很容易处于前瞻范围内可以是任意长度或其他特定属性 请注意,如果引擎不支持条件(并非所有都支持),那么这将不起作用
# (?:.*?(?>((?(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个)
这不是正则表达式的工作。最好尝试遍历字符串并计算每种类型包含多少个字符。接下来根据规则检查计数。对于下一个阅读代码的人来说,它也更清晰。当然,它可能更适合于代码。但我想用正则表达式。怎么做?非常聪明,脱帽致敬!我们赢了。它又好又短。我知道这是可以做到的。多谢各位@ChadJohnson:空间允许吗?不,谢谢你的提问。嘿,还有一个问题:如果你不想只需要两个字符,而是三个字符,你会如何强制执行三个字符?@ChadJohnson:要对三个字符类执行相同的操作(遵循相同的想法),你会得到这样一个结果:它相对有效,但有点长。在本例中,简单的方法是以四种不同的模式测试每个角色类,并计算成功的数量。哈哈…很好。这当然行得通,不过我想我会选择Casimir et Hippolyte的版本,因为它比较短:)我想我的头爆炸了。@ChadJohnson-希望爆炸不是致命的。我留下这个正则表达式供高级使用。这并不意味着任何人都能理解——也许是少数人。哈哈,只是开玩笑的人。这是好东西…感谢分享:)@ChadJohnson-对这个结构进行了大量调试测试。发现在交替周围添加原子组修复了一系列延迟回溯。而且,发现从性能角度看,它的速度与从锚位置(即
^
)看到的大量外观一样快。这意味着两种范式转变为一种范式。小于或等于。但这取决于条件。这个特殊的条件可以在点网fwiw中模拟。新年快乐!!
** 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 )
,