RegEx之方括号和小括号加竖线的区别

[size=large][b]正则表达式之方括号和小括号加竖线的区别[/b][/size]


[size=medium][b]问题:[/b][/size]
在 javascript 中,我使用下面的一个正则,用来验证电话号码:
1. 长度是 10 位
2. 第一位是 7 、8 或 9


var reg_num = /^(7|8|9)\d{9}$/



下面一个是同事推荐使用的:

var reg_num = /^[789]\d{9}$/



[size=medium][b]回答:[/b][/size]
如果只是用来验证,下面的是等价的:

//

/^(7|8|9)\d{9}$/

/^[789]\d{9}$/

/^[7-9]\d{9}$/

//


原因:

[color=darkblue](a|b|c)[/color] 是正则中的 "OR" ,意思是: "a 或 b 或 c", 尽管方括号也是或的意思,但是小括号提供捕获引用功能。 可以使用 [color=indigo](?:7|8|9)[/color] 不捕获引用。

[color=indigo][abc][/color] 是 "单字符集合",意思是 "集合内的任意一个字符 a 或 b 或 c" 。
同时 “单字符集合”为了简写起见,可以使用小横线来表示一个区间,例如: [color=indigo][a-d] = [abcd][/color]
而[color=olive]小括号加竖线[/color] 则不可以简写。

还有一个原因是,[] 虽然是 or 逻辑的简写,但是只能是匹配单个字符时的或的逻辑。
而[color=olive]小括号加竖线[/color],则可以写多个字符或的逻辑匹配:[color=indigo](abc|def)[/color]


[color=indigo](7|8|9)[/color] 和 [color=indigo][789][/color] 是不等价的,因为前者具有捕获引用功能,而后者没有。
[color=indigo](?:7|8|9)[/color] 和 [color=indigo][789][/color] 则是等价。


-


引用:

- http://stackoverflow.com/questions/9801630/what-is-the-difference-between-square-brackets-and-parentheses-in-a-regex


-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值