我是学习正则表达式的新手,我遇到了这个答案 https://stackoverflow.com/questions/14850553/javascript-regex-for-password-containing-at-least-8-characters-1-number-1-uppe它使用正向前瞻来验证密码。
正则表达式是 -(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$/)
用户提供的细分是 -
(/^
(?=.*\d) //should contain at least one digit
(?=.*[a-z]) //should contain at least one lower case
(?=.*[A-Z]) //should contain at least one upper case
[a-zA-Z0-9]{8,} //should contain at least 8 from the mentioned characters
$/)
但是,我不太清楚如何将多个前瞻链接在一起。据我所知,正向先行检查表达式后面是否跟随先行中指定的内容。举个例子,这个answer https://stackoverflow.com/a/24226963/8884441 says -
正则表达式is(?= all)
匹配字母is
,但前提是它们后面紧跟着字母all
所以,我的问题是各个前瞻是如何工作的?如果我把它分解——
- 第一部分是
^(?=.*\d)
。这是否表明在starting的字符串中,查找任何字符出现零次或多次,后跟 1 位数字(从而检查 1 位数字是否存在)?
- 如果第一部分正确,则第二部分正确
(?=.*[a-z])
,它是否检查after检查字符串开头的步骤 1,查找任何字符出现零次或多次,后跟小写字母?或者这两个前瞻彼此完全无关?
- 还有,这个有什么用
( )
围绕每一个展望?它会创建一个捕获组吗?
我也看过雷克格文章 http://rexegg.com/regex-lookarounds.html前瞻,但没有多大帮助。
将不胜感激任何帮助。
正如评论中提到的,这里的关键点不是前瞻,而是回溯:
(?=.*\d)
寻找完整的行(.*
),然后回溯找到至少一个数字(\d
).
This is repeated throughout the different lookaheads and could be optimized like so:
(/^
(?=\D*\d) // should contain at least one digit
(?=[^a-z]*[a-z]) // should contain at least one lower case
(?=[^A-Z]*[A-Z]) // should contain at least one upper case
[a-zA-Z0-9]{8,} // should contain at least 8 from the mentioned characters
$/)
这里,应用了对比原理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)