我为密码策略匹配构建了一个正则表达式,但它没有按预期工作
/((?= \ d)(?=。 [AZ])(?= [AZ])(?=。 [@#\ $%!])(?!(。)* \ 1 {2,})。{6,20})/
Password must satisfy below rules
- >必须有1位
- >必须有1个大写字母
- >必须有1个小写字母
- >必须有一个特定字符来自给定列表
- >至少6个字符长
- >最多20个字符长
- >不超过2个相同的字符
所以匹配
aDm!n1,Adw1n @
但下面不得匹配 aaaD!n1,teSt @ 111
我搜索了这个正则表达式,发现“(?!(。)* \ 1 {2,}}”无法正常工作
我不知道为什么它不起作用,即使它有先见否定的断言。
提前致谢
答案 0 :(得分:1)
您必须提供开始和结束锚点。
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#\$%\!])(?!.*(.).*\1.*\1).{6,20}$
要匹配不包含两个以上重复字符的字符串,您需要使用像(?!.*(.).*\1.*\1)
这样的负前瞻,它断言我们要匹配的字符串不会包含不超过两个重复的字符串字符。
(?!)
否定前瞻,检查是否没有.*
任何字符零次或多次。(.)
抓获了一个角色。 .*
任何字符零次或多次。\1
对组索引的引用1.也就是说,它指的是组1已经捕获的字符。.*
任何字符零次或多次。\1
反向引用组索引1中的字符。代码:
> var re = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#\$%\!])(?!.*(.).*\1.*\1).{6,20}$/;
undefined
> re.test('aDm!n1')
true
> re.test('Adw1n@')
true
> re.test('tetSt@11')
false
答案 1 :(得分:0)
(?:(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#\$%!])(?!.*(.).*\1.*\1).{6,20})
你需要这个。看看演示。
http://regex101.com/r/hQ9xT1/22
你的正则表达式失败了
(?!(.)*\1{2,})
无效,因为它会找到连续重复的字符而不是任何三次或更多的字符。所以请使用(?!.*(.).*\1.*\1)
。
var re = /^(?:(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#\$%!])(?!.*(.).*\1.*\1).{6,20})$/gm;
var str = 'aaaD!n1\nteSt@111\naDm!n1\nAdw1n@';
var m;
while ((m = re.exec(str)) != null) {
if (m.index === re.lastIndex) {
re.lastIndex++;
}
// View your result using the m-variable.
// eg m[0] etc.
}