Javascript Regex-使用两种不同的模式验证帐号
我需要验证一个帐号。 一个有效的数字可以是一个由11个数字组成的序列,也可以是由连字符分隔的3组数字(2个数字-3个数字-6个数字) 我试过这个:Javascript Regex-使用两种不同的模式验证帐号,javascript,regex,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.te
/^([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位)
111111(超过11位)
123-23-678912(11位,但没有正确分开,它应该是2位-3位-6位)由于
|
正则表达式运算符优先级最低,它应该这样写:
/^(?:[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
作为旁注,由于您不需要使用该分组表达式捕获任何内容,因此我在前面加了?:
。实际上,它还可以进一步优化:
/^[0-9]{2}(?:[0-9]{9}|-[0-9]{3}-[0-9]{6})$/
。。。你的选择越少越好。但在这种情况下,我想这真的没什么大不了的
简而言之,这两种模式可以说明问题:
/^a|b$/
这读作“匹配字符串开头的a
,或字符串结尾的b
”
/^(?:a|b)$/
这读作“匹配字符串的
开头
,后跟a
或b
,后跟字符串的结尾
”。这不是重复,因为我不是在问如何用XX-XXX-XXXXXX模式验证数字。我想问的是,为什么我的正则表达式中只有一条规则有效,而另一条则无效。不过,对于看到这个问题的未来用户来说,这仍然是一个很好的信息,所以我将保留它。你没有被关闭的危险。也许我没有解释清楚:(一个有效的数字可以是一个11位数的序列(123456789123)或者一个两位数的序列,连字符,三位数,连字符,六位数(12-123-123456)这与我所说的有何矛盾?请检查我回答中的示例:您给出的规则实际上都不够严格,因为它们(因为|
优先级)不适用于整个字符串。我的错。它应该是“12345678912”。我需要做什么才能使这两条规则适用于整个字符串,而不仅仅是乞讨或结束。对不起,但是-不,它不适用。请使用此模式。