正则表达式不超过两个重复的字母/数字

时间:2013-07-31 14:30:42

标签: javascript regex

我要求在XSL文件中处理不超过两个相同字母/数字的正则表达式。

  • 没有空间
  • 不支持特殊字符
  • 支持(a-z,A-Z,0-9)
  • 需要其中一个a-z
  • 需要0-9之一
  • 不超过2个相同的字母/数字(即BBB将失败,BB被接受)

到目前为止我有什么

(?:[^a-zA-Z0-9]{1,2})

5 个答案:

答案 0 :(得分:24)

这个正则表达式会这样做: ^(?!.*([A-Za-z0-9])\1{2})(?=.*[a-z])(?=.*\d)[A-Za-z0-9]+$

以下是细分:

(?!.*([A-Za-z0-9])\1{2})确保没有一个字符连续重复两次以上。

(?=.*[a-z])至少需要一个小写字母

(?=.*\d)至少需要一位数

[A-Za-z0-9]+只允许使用字母和数字

编辑: 从否定前瞻中删除了无关的.*

答案 1 :(得分:13)

对于连续重复3次或更多次的相同角色,请尝试:

([a-zA-Z0-9])\1{2,}

示例匹配(同时测试herehere):AABBAA(无匹配),AABBBAAA(匹配BBBAAA) ,ABABABABABABABA(不匹配),ABCCCCCCCCCC(匹配CCCCCCCCCC)。

答案 2 :(得分:6)

这个适合你吗?

/(\b(?:([A-Za-z0-9])(?!\2{2}))+\b)/

尝试一下:

var regex = new RegExp(/(\b(?:([A-Za-z0-9])(?!\2{2}))+\b)/)
var tests = ['A1D3E', 'AAAA', 'AABAA', 'abccddeeff', 'abbbc', '1234']

for(test in tests) {
   console.log(tests[test] + ' - ' + Boolean(tests[test].match(regex)))
}

将输出:

A1D3E - true
AAAA - false
AABAA - true
abccddeeff - true
abbbc - false
1234 - true

答案 3 :(得分:2)

您可以在2个正则表达式中执行此操作:

  1. /^(?=.*[a-z])(?=.*[0-9])[a-z0-9]+$/i这将确保至少有1个数字和1个字母,同时只接受字母和数字(没有空格或特殊字符)
  2. /([a-z0-9])\1{2,}/i如果匹配这个,那么就会有重复的字符。这意味着你应该抛出false
  3. 说明:

    第一个正则表达式:

    • ^:匹配行的开头
    • (?=.*[a-z]):检查是否至少有一个字母
    • (?=.*[0-9]):检查是否至少有一位数字
    • [a-z0-9]+:如果检查结果为真,则只匹配数字/字母一次或多次
    • $:匹配行尾
    • i:修饰符,匹配大小写不敏感

    第二个正则表达式:

    • ([a-z0-9]):匹配并分组数字或字母
    • \1{2,}:匹配组1两次或更多次
    • i:修饰符,匹配大小写不敏感

答案 4 :(得分:1)

在回应澄清时,似乎并不严格要求单个正则表达式。在这种情况下,我建议你使用几个正则表达式或函数。我的猜测是,性能不是必需的,因为通常这些检查是在响应用户输入的情况下完成的。用户输入验证可能需要100毫秒,并且看起来仍然是即时的,您可以在100毫秒内运行批次代码。

例如,我个人会在单独的测试中检查您的每个条件。首先,检查空格。其次,检查至少一个字母。接下来,检查至少一个号码。最后,查找三个或更多重复字符的任何跨度。

您的代码将更容易理解,以后修改规则会更容易(经验表明,几乎肯定会发生这种情况)。

例如:

function do_validation(string) {
    return (has_no_space(string) &&
            has_no_special_char(string) &&
            has_alpha(string) &&
            has_digit(string) &&
            ! (has_repeating(string)))

我个人认为上述内容比一个复杂的正则表达式更容易阅读。此外,添加或删除规则不会使您必须重新实现复杂的正则表达式(因此,需要重新测试所有可能的组合)。