我需要验证一个帐号。 有效数字可以是完全 11 数字的序列,也可以是由连字符分隔的3组数字(2位 - 3位 - 6位数)
我试过了:
/^([0-9]{11})|([0-9]{2}-[0-9]{3}-[0-9]{6})$/
但它只适用于第二条规则。第一条规则不起作用,因为它允许超过11位的数字
这就是我在js函数中使用正则表达式的方法:
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位数)
答案 0 :(得分:4)
由于|
正则表达式运算符优先级最低,所以应该这样写:
/^(?:[0-9]{11}|[0-9]{2}-[0-9]{3}-[0-9]{6})$/
...以便交替模式被绑定到字符串的开头和结尾。
在代码中,模式检查字符串开头的11位序列,或“两位数,连字符,三位数,连字符,六位数”的序列< em>在其末尾 - 但从未真正将规则绑定到两端。这很容易证明:
var patt = /^([0-9]{11})|([0-9]{2}-[0-9]{3}-[0-9]{6})$/;
patt.test('acdbdfdsfsf22-333-666666'); // true
作为旁注,由于您不需要使用该分组表达式捕获任何内容,因此我将其添加到?:
前面。实际上,它可以进一步优化:
/^[0-9]{2}(?:[0-9]{9}|-[0-9]{3}-[0-9]{6})$/
...随着你的交替越少越好。但在这种情况下,我认为它确实无关紧要。
简而言之,问题可以用这两种模式来说明:
/^a|b$/
此处显示为“匹配a at the beginning of the string
或b at its end
。
/^(?:a|b)$/
内容为“匹配beginning of the string
,后跟a
或b
,后跟the end of the string
'。