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 ) 
,