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

时间:2014-11-24 16:58:52

标签: regex lookahead

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

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

有效。在此基础上,我想要求只有两个这样的组才能使密码有效。

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

我是否可以修改此正则表达式以支持此要求?

4 个答案:

答案 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])).+$

RegEx Demo

答案 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是你的不同模式