-3

嗨,因为我是正则表达式的新手,所以我想避免遵循我的输入情况

1111 - not allowed
aaaa - not allowed
abcd - not allowed
1234 - not allowed

并且字符串的大小必须是4 个字符 ,任何人都可以帮助我如何为上述情况编写正则表达式。

编辑:

这是我在jquery中所做的

if(NewPasscode.match('^(?!1111|aaaa|abcd|1234).{4}$')) {
    alert('Not Ok');
    return false;
} else {
   alert('Ok');
}
4

4 回答 4

3

您可以使用否定的前瞻断言:

^(?!1111|aaaa|abcd|1234).{4}$

这将匹配任何由 4 个字符组成的字符串,除了 1111aaaaabcd1234

但是,仅反转测试可能更容易:

1111|aaaa|abcd|1234

这将匹配1111, aaaa, abcd, 或1234。您可以简单地检查输入字符串的长度,如果它与此模式匹配,则拒绝它。

就此而言,您可以将这些不允许的字符串以您选择的语言存储在列表/数组等中。只需检查字符串的长度,以及它是否包含在不允许的输入列表中。如果您有更多需要拒绝的模式,这是一种更简洁的方法。


更新

由于您似乎使用的是 javascript,请注意您需要指定正则表达式文字:

if(NewPasscode.match(/^(?!1111|aaaa|abcd|1234).{4}$/)) {
    alert('Ok');
    return false;
} else {
   alert('NOT Ok');
}

但是,如果您只是测试匹配,则可以使用以下test方法:

if(/^(?!1111|aaaa|abcd|1234).{4}$/.test(NewPasscode)) {
    alert('Ok');
    return false;
} else {
   alert('NOT Ok');
}

要使用我的第二个建议:

if(NewPasscode.length == 4 && !/1111|aaaa|abcd|1234/.test(NewPasscode)) {
    alert('Ok');
    return false;
} else {
   alert('NOT Ok');
}

使用我的第三个建议:

var disallowed = ['1111','aaaa','abcd','1234'];
if(NewPasscode.length == 4 && disallowed.indexOf(NewPasscode) == -1) {
    alert('Ok');
    return false;
} else {
   alert('NOT Ok');
}
于 2013-09-24T14:10:15.760 回答
2

如果你想禁止 4 次相同的字符,你可以这样做:

^(?!(.)\1{3}|1234|abcd).{4}$

在 Regexr 上查看。

(.)\1{3}匹配任何字符(.)并将其存储在捕获组中。\1{3}然后检查此字符是否重复 3 次以上。

对于像“1234”这样的序列,除了明确列出它们之外别无他法,因为正则表达式不知道字符的含义。您可以检查一个字符是否相同,但不能检查一个字符是否与另一个字符有某种关系。

于 2013-09-24T14:24:14.280 回答
1

假设您不想要只有 4 种独特的可能性:

function isValidPassword(password){
  var consecutive = 1,
      lastChar = -1, o = -1;
  for (var i = 0; i < password.length; i++){
    o = password.charCodeAt(i);
    if (lastChar != -1 && (o == lastChar || o == lastChar + 1)){
      consecutive++;
    }else{
      consecutive = 1;
    }
    lastChar = o;
    if (consecutive == 4) return false;
  }
  return true;
};

以上防止:

  • 在字符串中找到的任何 4 个重复字符。
    例如 aaaa、bbbb、0000、xxxx 但不是aaab、bbba、0111 或 xxyz
  • 在字符串中找到的任何 4 个连续字符。
    例如 abcd、ghij、1234、6789 但 *不是abbcd、ghik、1245 或 7890

这会给你:

Password:  Valid?:
1111       False
aaaa       False
abcd       False
1234       False
foo        True
bar        True
baz        True
password   True
1112       False
aaab       False
ghij       False
1357890    True
于 2013-09-24T14:35:14.183 回答
0

这应该适合您的需求:

^(?!1111|aaaa|abcd|1234)[a-z0-9]{4}$

正则表达式可视化

调试演示

于 2013-09-24T14:10:04.000 回答