【问题标题】:Regular expression for no more than two repeated letters/digits不超过两个重复字母/数字的正则表达式
【发布时间】:2013-07-31 14:30:41
【问题描述】:

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

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

到目前为止我有什么

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

【问题讨论】:

  • 是一个正则表达式吗,或者返回true或false的函数可以吗?
  • @Bryan Oakley:我有一个函数可以检查变量是否与正则表达式匹配。返回真或假
  • @HamZa : AABAA 被接受,只要不是连续 3 个
  • 所以至少需要一个小写字母和一个数字?字符串也应该以(小写)字母开头还是无关紧要?
  • @rednaw:没关系,只要正则表达式满足所有要求

标签: javascript regex


【解决方案1】:

这个正则表达式会做到这一点: ^(?!.*([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]+ 只允许字母和数字

编辑: 从负面预测中删除了无关的.*

【讨论】:

  • 我正在测试正则表达式,但它与A1D3E(有效)或AAAA(无效)等字符串不匹配。
  • @Rasco:需要小写字母,所以A1D3E无效。
  • @Brian Stephens,现在工作正常,我已经测试了几个案例,还需要进一步测试
  • @cool_spirit 是Brian所说的小写字母吗?因为之前你说AABAA 是有效的
  • @rednaw,你说得对,他说AABAA 是有效的,但这与另一个需要数字的要求相矛盾。我认为他的意思是AABAA 示例只是为了澄清重复要求。令人困惑!
【解决方案2】:

(部分解决方案)对于匹配连续重复3次或更多次的相同字符,尝试:

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

示例匹配(测试herehere):AABBAA(无匹配)、AABBBAAA(匹配BBBAAA)、ABABABABABABABA(无匹配)、ABCCCCCCCCCC (匹配CCCCCCCCCC)。

【讨论】:

  • 正要发布这个!打败我!
  • 这不需要至少一个数字和一个字符
  • 我同意。此解决方案不需要至少一个数字和一个字符,不限于字母数字,并且与他试图匹配的相反。看我的回答,满足所有要求。
  • 我更改了答案,因此很明显它满足了其中一项要求。
  • @pkout 因为组(括号中的部分)第一次已经匹配了字符。您需要至少再重复两次。以防万一,请仔细检查您是否在模式中看到了 \1。这很关键。
【解决方案3】:

这个对你有用吗?

/(\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

【讨论】:

  • 赞成,...虽然不符合OP的要求,但确实符合我的要求,谢谢。
【解决方案4】:

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

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

说明:

第一个正则表达式:

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

第二个正则表达式:

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

【讨论】:

  • 不知何故,xsl文件不喜欢/,我不知道为什么
  • @cool_spirit 然后改用(?i)^(?=.*[a-z])(?=.*[0-9])[a-z0-9]+$(?i)([a-z0-9])\1{2,}。我以为这是纯 JS...
【解决方案5】:

作为对澄清的回应,似乎并不严格要求使用单个正则表达式。在这种情况下,我建议您使用几个正则表达式或函数。我的猜测是,性能不是必需的,因为通常这些检查是为了响应用户输入而完成的。用户输入验证可能需要 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)))

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

【讨论】:

  • 再次,谢谢,但我现在的处理方式是使用不同的方法,不想构建我的文件很多
猜你喜欢
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 2013-06-03
  • 2011-09-16
相关资源
最近更新 更多