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

正则表达式之方括号和小括号加竖线的区别


问题:


在 javascript 中,我使用下面的一个正则:
var reg_num = /^(7|8|9)\d{9}$/


下面一个是同事推荐使用的:
var reg_num = /^[789]\d{9}$/


目地是用来验证电话号码
      1. 长度是 10 位
      2. 第一位是 7 、8 或 9




回答:


如果只是用来验证,下面的是等价的:
//

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

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

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

//


原因:

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

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

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


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








-


引用:

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







-


猜你喜欢

转载自lixh1986.iteye.com/blog/2312143