首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex -用两种不同的模式验证帐号

Regex -用两种不同的模式验证帐号
EN

Stack Overflow用户
提问于 2014-03-30 21:08:14
回答 1查看 18.7K关注 0票数 3

我需要确认一个帐号。一个有效的数字可以是精确的11数字序列,也可以是由连字符分隔的3组数字(2位数字- 3位数字- 6位数字)。

我试过这个:

代码语言:javascript
复制
/^([0-9]{11})|([0-9]{2}-[0-9]{3}-[0-9]{6})$/

但它只适用于第二条规则。第一条规则不起作用,因为它允许11位以上的数字

以下是在js函数中使用regex的方式:

代码语言:javascript
复制
 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位)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-30 21:11:04

由于|正则表达式的优先级是最低的,所以应该编写如下所示:

代码语言:javascript
复制
/^(?:[0-9]{11}|[0-9]{2}-[0-9]{3}-[0-9]{6})$/

..。因此,交替模式被绑定到字符串的开头和结尾。

在您的代码中,模式检查字符串开头的11位数字序列或结尾的“两位数、连字符、三位数、连字符、六位数”的序列--但永远不会将规则绑定到两端。这很容易证明:

代码语言:javascript
复制
var patt = /^([0-9]{11})|([0-9]{2}-[0-9]{3}-[0-9]{6})$/;
patt.test('acdbdfdsfsf22-333-666666'); // true

作为一个sidenote,由于您不需要使用这个分组表达式捕获任何内容,所以我已经用?:将它放在了前面。实际上,它可以进行更多的优化:

代码语言:javascript
复制
/^[0-9]{2}(?:[0-9]{9}|-[0-9]{3}-[0-9]{6})$/

..。当你选择的越少,越好。但在这种情况下,我想这并不重要。

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

代码语言:javascript
复制
/^a|b$/

它读为“match a at the beginning of the string,或b at its end”。

代码语言:javascript
复制
/^(?:a|b)$/

这读为“匹配beginning of the string,后面跟着ab,后面跟着the end of the string”。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22749891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档