没有正面预测的正则表达式将密码与一个大写,一个小写,一个数字和至少八个字符匹配

时间:2014-09-19 14:56:52

标签: regex

我正在寻找匹配至少包含8个字符,至少包含一个大写字符,至少一个小写字符和至少一个数字的字符串(即密码)的正则表达式。

有效的正则表达式(在here的帮助下)将是:

(^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$)

此正则表达式使用正向前瞻(?=)。这是一项昂贵的操作。是否可以在不使用正向前瞻的情况下制作此正则表达式?

1 个答案:

答案 0 :(得分:2)

  

至少8个字符,至少一个大写字符,   至少一个小写字符和至少一个数字

     
    

有点像拼图

  

好的,我会把它作为一个谜题,只要它被理解为:

  • 没有正则表达式的编码会更有效率。
  • 与单独使用正则表达式的成本相比,前瞻性并不昂贵。

而且这种解决方案可能比使用前瞻更加昂贵。

描述

  1. 我们可以使用像

    这样的子模式
    \A(?:[A-Z]|[a-z]|[0-9]|.){8,}
    

    检查主题中至少有8个字符,同时提供4个选项(大写,小写,数字或其他字符)。

  2. 然后,我们将为前3个必需选项创建反向引用:

    \A(?:(?<upper>[A-Z])|(?<lower>[a-z])|(?<digit>[0-9])|.){8,}
    
  3. 最后,我们将使用 IF子句来检查每个组是否已被捕获:

    (?(upper)  (?#check 2nd condition)  |  (?#make it fail)  )
    

    如果不满足任何条件,请使用(?!)使其失败:

    (?(upper)(?(lower)(?(digit)|(?!))|(?!))|(?!))
    
  4. 正则表达式

    \A                        #beggining of string
    (?>                       #MAIN iteration (atomic only for efficiency)
        (?<upper>[A-Z])       #  an uppercase letter
      |                       # or
        (?<lower>[a-z])       #  a lowercase letter
      |                       # or
        (?<digit>[0-9])       #  a digit
      |                       # or
        .                     #  anything else
    ){8,}?                    #REPEATED 8+ times
                              #
                              #CONDITIONS:
    (?(upper)                 # 1. There must be at least 1 uppercase
        (?(lower)             #    2. If (1), there must be 1 lowercase
            (?(digit)         #       3. If (2), there must be 1 digit
              | (?!)          #          Else fail
            )                 #
          | (?!)              #       Else fail
        )                     #
      | (?!)                  #    Else fail
    )                         #
    

    一衬垫:

    \A(?>(?<upper>[A-Z])|(?<lower>[a-z])|(?<digit>[0-9])|.){8,}?(?(upper)(?(lower)(?(digit)|(?!))|(?!))|(?!))
    

    regex101 demo