PHP和Javascript中密码匹配的正则表达式

时间:2014-11-28 06:11:37

标签: javascript php regex

我为密码策略匹配构建了一个正则表达式,但它没有按预期工作

/((?= \ 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,}}”无法正常工作

我不知道为什么它不起作用,即使它有先见否定的断言。

提前致谢

2 个答案:

答案 0 :(得分:1)

您必须提供开始和结束锚点。

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#\$%\!])(?!.*(.).*\1.*\1).{6,20}$

DEMO

要匹配不包含两个以上重复字符的字符串,您需要使用像(?!.*(.).*\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.
}