正向超前的RegEx-密码规则(包含必需的数字和字符)

时间:2019-05-23 00:55:37

标签: regex regex-lookarounds regex-group regex-greedy

我想了解以下正则表达式,并尝试在regex101

中对其进行测试
^(?=.*[a-zA-Z])(?=.*[0-9]).{4,}$

2 个答案:

答案 0 :(得分:0)

解释

 ^                        # BOS
 (?= .* [a-zA-Z] )        # Lookahead, must be a letter
 (?= .* [0-9] )           # Lookahead, must be a number
 .{4,}                    # Any 4 or more characters 
 $                        # EOS

答案 1 :(得分:0)

该正则表达式意义不大,可以缩短为:

.{4,}$ // match at least 4 characters (or more) before ending

原因是先行定义了匹配组模式结束的位置。但是,您将先行放置在输入字符串的开头,在所有先行模式的前面捕获“”(什么都没有)。所以所有 lookaheads 都是多余的。

所以:

  

^模式必须从输入的开头开始

     

(?=.*[a-zA-Z])查找任意数量的连续字母(查找为“ TestPassword”,不包含在匹配组中)

     

(?=.*[0-9])查找任意数量的数字(找到“ 1”,不包含在匹配组中)

     

鉴于上面,唯一的匹配项是“ TestPassword1”开头的“”。现在我们继续进行匹配...

     

.{4,}$现在可以匹配位于末尾的至少4个字符中的任何一个   输入(找到“ TestPassword1”,作为匹配组返回

有关证明和解释,请参见以下代码:

let regex = /^(?=.*[a-zA-Z])(?=.*[0-9]).{4,}$/;
[match] = "TestPassword1".match(regex);
console.log(match); //TestPassword1

// just test for lookaheads result in matching an empty string at the start of input (before "T")
regex = /^(?=.*[a-zA-Z])(?=.*[0-9])/;
match = "TestPassword1".match(regex);
console.log(match); //[""]

// we're now testing for at least 4 characters of anything just before the end of input
regex = /.{4,}$/;
[match] = "TestPassword1".match(regex);
console.log(match); //TestPassword1