当前位置: 首页 > 知识库问答 >
问题:

不带正向前瞻的正则表达式,以匹配一个大写、一个小写、一个数字和至少八个字符的密码

秦永望
2023-03-14

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

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

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

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

共有1个答案

平学
2023-03-14

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

这有点像一个谜

好吧,我将把这当作一个谜题,前提是:

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

>

\A(?:[A-Z]|[a-z]|[0-9]|.){8,}

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

然后,我们将为前3个必需选项创建一个反向参考:

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

最后,我们将使用IF子句检查每个组是否被捕获:

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

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

(?(upper)(?(lower)(?(digit)|(?!))|(?!))|(?!))
\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演示

 类似资料: