我需要确认一个帐号。一个有效的数字可以是精确的11数字序列,也可以是由连字符分隔的3组数字(2位数字- 3位数字- 6位数字)。
我试过这个:
/^([0-9]{11})|([0-9]{2}-[0-9]{3}-[0-9]{6})$/但它只适用于第二条规则。第一条规则不起作用,因为它允许11位以上的数字
以下是在js函数中使用regex的方式:
var re = /^([0-9]{11})|([0-9]{2}-[0-9]{3}-[0-9]{6})$/;
if (re.test(txtNumber.value)==true) {
return 1;
}
else {
alert("Invalid Account Number");
return 0;
}如有任何建议或指导,将不胜感激。
有效数字:
12345678912 (11位数)
12-345-678912 (用连字符分隔的11位数字)
无效编号:
1223 (小于11位数)
111111111111 (超过11位数)
123-23-678912 (11位数字,但不能正确分隔,应该是2位-3位-6位)
发布于 2014-03-30 21:11:04
由于|正则表达式的优先级是最低的,所以应该编写如下所示:
/^(?:[0-9]{11}|[0-9]{2}-[0-9]{3}-[0-9]{6})$/..。因此,交替模式被绑定到字符串的开头和结尾。
在您的代码中,模式检查字符串开头的11位数字序列或结尾的“两位数、连字符、三位数、连字符、六位数”的序列--但永远不会将规则绑定到两端。这很容易证明:
var patt = /^([0-9]{11})|([0-9]{2}-[0-9]{3}-[0-9]{6})$/;
patt.test('acdbdfdsfsf22-333-666666'); // true作为一个sidenote,由于您不需要使用这个分组表达式捕获任何内容,所以我已经用?:将它放在了前面。实际上,它可以进行更多的优化:
/^[0-9]{2}(?:[0-9]{9}|-[0-9]{3}-[0-9]{6})$/..。当你选择的越少,越好。但在这种情况下,我想这并不重要。
简而言之,问题可以用以下两种模式来说明:
/^a|b$/它读为“match a at the beginning of the string,或b at its end”。
/^(?:a|b)$/这读为“匹配beginning of the string,后面跟着a或b,后面跟着the end of the string”。
https://stackoverflow.com/questions/22749891
复制相似问题