我需要验证一个帐号。有效数字可以是正好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位)
由于|正则表达式运算符的优先级最低,所以应该这样写:
/^(?:[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,然后是a或b,然后是the end of the string”。