[英]Regular expression for no more than two repeated letters/digits
我需要处理 XSL 文件中不超过两个相同字母/数字的正则表达式。
BBB
将失败, BB
被接受)到目前为止我所拥有的
(?:[^a-zA-Z0-9]{1,2})
这个正则表达式会这样做: ^(?!.*([A-Za-z0-9])\\1{2})(?=.*[az])(?=.*\\d)[A-Za-z0-9]+$
这是细分:
(?!.*([A-Za-z0-9])\\1{2})
确保没有一个字符连续重复两次以上。
(?=.*[az])
至少需要一个小写字母
(?=.*\\d)
至少需要一位
[A-Za-z0-9]+
只允许字母和数字
编辑:从负前瞻中删除了一个无关紧要的.*
这个对你有用吗?
/(\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
您可以在 2 个正则表达式中执行此操作:
/^(?=.*[az])(?=.*[0-9])[a-z0-9]+$/i
这将确保至少有 1 个数字和 1 个字母,同时只接受字母和数字(没有空格或特殊字符)/([a-z0-9])\\1{2,}/i
如果匹配到这个,那么就有重复的字符了。 这意味着你应该抛出false
。第一个正则表达式:
^
: 匹配行首(?=.*[az])
: 检查是否至少有一个字母(?=.*[0-9])
: 检查是否至少有一位[a-z0-9]+
:如果检查为真,则只匹配数字/字母一次或多次$
: 匹配行尾i
: 修饰符,匹配不区分大小写第二个正则表达式:
([a-z0-9])
: 匹配和分组一个数字或一个字母\\1{2,}
: 匹配组 1 两次或更多次i
: 修饰符,匹配不区分大小写作为对澄清的回应,似乎并不严格要求单个正则表达式。 在这种情况下,我建议您使用几个正则表达式或函数。 我的猜测是,性能不是必需的,因为通常这些类型的检查是为了响应用户输入而完成的。 用户输入验证可能需要 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)))
我个人认为上述内容比一个复杂的正则表达式更容易阅读。 另外,添加或删除规则不会使您必须重新实现复杂的正则表达式(因此,需要重新测试所有可能的组合)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.