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

edd*_*ddy 3 javascript regex

我需要验证一个帐号。有效数字可以是正好11位的序列或由连字符分隔的 3 组数字(2 位 - 3 位 - 6 位)

我试过这个:

/^([0-9]{11})|([0-9]{2}-[0-9]{3}-[0-9]{6})$/
Run Code Online (Sandbox Code Playgroud)

但它只适用于第二条规则。第一条规则不起作用,因为它允许超过 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;
         }
Run Code Online (Sandbox Code Playgroud)

任何建议或指导将不胜感激

有效号码:

12345678912(11位)

12-345-678912(以连字符分隔的 11 位数字)

无效号码:

1223(小于11位)

111111111111(11位以上)

123-23-678912(11位,但没有正确分隔,应该是2位-3位-6位)

rai*_*7ow 5

由于|正则表达式运算符的优先级最低,所以应该这样写:

/^(?:[0-9]{11}|[0-9]{2}-[0-9]{3}-[0-9]{6})$/
Run Code Online (Sandbox Code Playgroud)

...以便交替模式绑定到字符串的开头和结尾。

目前的情况是在你的代码,模式检查的11位或者序列在字符串的开头的“两个数字,连字符,三个数字,连字符,六位数字”,或序列在其结束-但从来没有真正绑定的规则两端。这很容易证明:

var patt = /^([0-9]{11})|([0-9]{2}-[0-9]{3}-[0-9]{6})$/;
patt.test('acdbdfdsfsf22-333-666666'); // true
Run Code Online (Sandbox Code Playgroud)

作为旁注,由于您不需要使用该分组表达式捕获任何内容,因此我在它前面加上了?:. 实际上,它可以进一步优化:

/^[0-9]{2}(?:[0-9]{9}|-[0-9]{3}-[0-9]{6})$/
Run Code Online (Sandbox Code Playgroud)

......因为你交替的越少越好。但在这种情况下,我想它真的没有多大关系。


简而言之,这个问题可以用这两种模式来说明:

/^a|b$/
Run Code Online (Sandbox Code Playgroud)

这读作'匹配要么a at the beginning of the string,要么b at its end

/^(?:a|b)$/
Run Code Online (Sandbox Code Playgroud)

这读作“匹配beginning of the string,然后是ab,然后是the end of the string”。