我正在寻找匹配至少包含8个字符,至少包含一个大写字符,至少一个小写字符和至少一个数字的字符串(即密码)的正则表达式。
有效的正则表达式(在here的帮助下)将是:
(^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$)
此正则表达式使用正向前瞻(?=
)。这是一项昂贵的操作。是否可以在不使用正向前瞻的情况下制作此正则表达式?
答案 0 :(得分:2)
至少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)|(?!))|(?!))|(?!))