Javascript 不超过两个重复字母/数字的正则表达式
我需要处理XSL文件中不超过两个相同字母/数字的正则表达式Javascript 不超过两个重复字母/数字的正则表达式,javascript,regex,Javascript,Regex,我需要处理XSL文件中不超过两个相同字母/数字的正则表达式 没有空间 不支持特殊字符 支架(a-z,a-z,0-9) 需要a-z中的一个 需要0-9中的一个 不超过2个相同的字母/数字(即,BBB将失败,BB被接受) 到目前为止我所拥有的 (?:[^a-zA-Z0-9]{1,2}) 作为对澄清的回应,似乎并不严格要求使用单个正则表达式。在这种情况下,我建议您使用几个正则表达式或函数。我的猜测是,性能不是一个要求,因为通常这些检查都是根据用户输入进行的。用户输入验证可能需要100毫秒,但仍然
- 没有空间
- 不支持特殊字符
- 支架(a-z,a-z,0-9)
- 需要a-z中的一个
- 需要0-9中的一个
- 不超过2个相同的字母/数字(即,
将失败,BBB
被接受)BB
(?:[^a-zA-Z0-9]{1,2})
作为对澄清的回应,似乎并不严格要求使用单个正则表达式。在这种情况下,我建议您使用几个正则表达式或函数。我的猜测是,性能不是一个要求,因为通常这些检查都是根据用户输入进行的。用户输入验证可能需要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)))
我个人认为,这是一个数量级比一个复杂的正则表达式更容易阅读。另外,添加或删除规则并不需要重新实现复杂的正则表达式(因此,需要重新测试所有可能的组合) 要匹配连续重复3次或更多次的相同字符,请尝试:
([a-zA-Z0-9])\1{2,}
样本匹配(和均测试):AABBAA
(无匹配)、aabbaaa
(匹配BBB
和AAA
),abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
^(?。*([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]+
只允许字母和数字
编辑:
从负前瞻中删除了一个无关的*
,您可以在两个正则表达式中执行此操作:
/^(?=.[a-z])(?=.[0-9])[a-z0-9]+$/i
这将确保至少有1个数字和1个字母,同时只接受字母和数字(无空格或特殊字符)
/([a-z0-9])\1{2,}/i
如果此字符匹配,则存在重复字符。这意味着您应该抛出false
说明:
第一个正则表达式:
^
:匹配行的开头
(?=.[a-z])
:检查是否至少有一个字母
(?=.[0-9])
:检查是否至少有一个数字
[a-z0-9]+
:如果检查为真,则只匹配数字/字母一次或多次
$
:匹配行尾
i
:修饰符,匹配不区分大小写
第二个正则表达式:
([a-z0-9])
:匹配数字或字母并将其分组
\1{2,}
:匹配组1两次或多次
i
:修饰符,匹配不区分大小写
这个对你有用吗
/(\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
它必须是一个正则表达式,或者返回true或false的函数可以吗?@Bryan Oakley:我有一个函数要检查变量是否与正则表达式匹配。哪个返回true或false@HamZa:AABAA可接受,只要不连续3个字母,至少需要一个小写字母和一个数字?字符串是否也应该以一个(小写)字母开头?这不重要吗?@rednaw:不重要,只要正则表达式满足所有要求,我就要发布这个!打败我!这不需要至少一个数字和一个字符。这个解决方案不需要至少一个数字和一个字符,也不局限于字母数字,这与他试图匹配的相反。请看我的答案,它满足所有要求。我更改了答案,以便清楚地表明它满足了其中一个要求。我相信3是意外地从9切换而来的<代码>([a-zA-Z0-3])\1{2,}
应该是([a-zA-Z0-9])\1{2,}
我正在测试正则表达式,它与A1D3E
(有效)或AAAA
(无效)之类的字符串不匹配。@Rasco:需要小写字母,所以A1D3E
无效。@Brian Stephens,这和现在一样有效,我已经测试了几个案例,需要进一步测试吗too@cool_spirit布莱恩说需要小写字母吗?因为之前你说过,AABAA
会valid@rednaw,你说得对,他说,AABAA
是有效的,但这与另一个要求也需要数字相矛盾。我想他指的是AABAA
示例,只是为了澄清重复要求。令人困惑再次感谢,但我现在是如何使用不同的方法来处理的,我不想以某种方式构建我的文件,xsl文件不太喜欢/,我不知道why@cool_spirit然后使用(?i)^(?=.[a-z])(?=.[0-9])[a-z0-9]+$
和(?i)([a-z0-9])\1{2,}
。我假设这是纯JS…向上投票,。。。虽然它不符合OP的要求,但它确实符合我的要求,谢谢。