我理解正则表达式相当不错,但我不能经常使用它们来成为专家.我遇到了一个用于验证密码强度的正则表达式,但它包含了一些我不熟悉的正则表达式概念.正则表达式是:
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,}$
Run Code Online (Sandbox Code Playgroud)
并且用简单的英语表示该字符串必须包含至少一个小写字符,一个大写字符和一个数字,并且该字符串的长度必须至少为六个字符.任何人都可以为我解释这个模式实际上如何描述这个规则吗?我看到一个字符串char ^的开头和字符串char $的结尾,三个带有lookaheads的组,一个匹配任何字符.并重复{6,}.
感谢任何可以帮助我理解这一点的正则表达大师.
Ric*_*dle 14
在正常情况下,一段正则表达式匹配输入字符串的一部分,并"消耗"该字符串的那一部分.表达式的下一部分与下一部分字符串匹配,依此类推.
Lookahead断言不消耗任何字符串,所以你的三个先行断言:
(?=.*\d)(?=.*[a-z])(?=.*[A-Z])每个意思是"这个模式(分别跟一个数字,一个小写字母,一个大写字母)必须出现在字符串中的某个地方",但它们不会向前移动当前的匹配位置,所以表达式的其余部分:
.{6,}(这意味着"六个或更多字符")必须仍然匹配整个输入字符串.
前瞻组不消耗输入.这样,不同的前瞻组实际上匹配相同的字符.
你可以这样想:搜索任何东西(.*)直到你找到一个数字(\d).如果你这样做,那就回到这个小组的开头(lookahead的概念).现在寻找任何东西(.*),直到你找到一个小写字母.重复大写字母.现在,匹配任何6个或更多字符.