正则表达式 - 使用两种不同的模式验证帐号

时间:2014-03-30 21:08:14

标签: javascript regex

我需要验证一个帐号。 有效数字可以是完全 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位数)

1 个答案:

答案 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 stringb at its end

/^(?:a|b)$/

内容为“匹配beginning of the string,后跟ab,后跟the end of the string'。