我正在学习正则表达式,我发现了一个有趣且有用的页面,用于密码输入验证here。我的问题是关于以下表达式中的.*
:
"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$"
我理解.*
是一个表示任意数量文本(或没有文本)的通配符,但我在这些先行表达式中围绕其目的无法理解。为了使这些前瞻功能符合要求,为什么这些必要?
答案 0 :(得分:2)
Lookahead意味着直接预测。所以,如果你写:
(?=a)
这意味着第一个字符应为a
。有时,例如使用密码检查,您不希望这样。你想表达的地方应该是a
。所以:
(?=.*a)
表示第一个字符可以是b
,8
或@
。但最终应该有一个a
。
你的正则表达式意味着:
^ # start a match at the beginning of the string
(?=.*[a-z]) # should contain at least one a-z character
(?=.*[A-Z]) # should contain at least one A-Z character
(?=.*\d) # should contain at least one digit
[a-zA-Z\d]{8,} # consists out of 8 or more characters and only A-Za-z0-9
$ # end the match at the end of the string
没有.*
,就永远不会有匹配,因为:
"^(?=[a-z])(?=[A-Z])(?=\d)[a-zA-Z\d]{8,}$"
表示:
^ # start a match at the beginning of the string
(?=[a-z]) # first character should be an a-z character
(?=[A-Z]) # first character should be an A-Z character
(?=\d) # first character should be a digit
[a-zA-Z\d]{8,} # consists out of 8 or more characters and only A-Za-z0-9
$ # end the match at the end of the string
由于没有同时具有A-Z字符和数字的字符。这永远不会得到满足。
附注:
.
默认为not match the new line character; ^[A-Za-z0-9]{8,}$
这意味着您只会在没有新行的情况下验证输入。