日期:2014-05-18  浏览次数:20923 次

请问,正则表达式的这个"|"符号
正则表达式:(19|20)\d{2}


这是用来检查日期的正则表达式,比如1987这个字符串就能匹配
我的问题是:

"|"符号为什么选择的是19或20,不是选择9或2呢?照理说应该是9或2啊?


------解决方案--------------------
19|20\d{2}
这样是9或者2。
------解决方案--------------------
探讨

19|20\d{2}
这样是9或者2。

------解决方案--------------------
总结一下就是:| 只要碰不到结束的)或者下一个|的话,就会往下去匹配,知道匹配不上为止,也就是一个贪婪的模式
1L 说的这个
19|20\d{2}
会匹配 19 或 20\d{2}
------解决方案--------------------
() 表捕获组

你的表达式没必要捕获组
所以可以这样写:

(?:19|20)\d{2}


(?n)(19|20)\d{2}

------解决方案--------------------
参考

正则表达式学习参考

2.2.7 分支结构(Alternation)
当一个字符串的某一子串具有多种可能时,采用分支结构来匹配,“|”表示多个子表达式之间“或”的关系,“|”是以()限定范围的,如果在“|”的左右两侧没有()来限定范围,那么它的作用范围即为“|”左右两侧整体。

举例:

“^aa|b$”在匹配“cccb”时,是可以匹配成功的,匹配的结果是“b”,因为这个表达式表示匹配“^aa”或“b$”,而“b$”在匹配“cccb ”时是可以匹配成功的。

“^(aa|b)$”在区配“cccb”时,是匹配失败的,因为这个表达式表示在“开始”和“结束”位置之间只能是“aa”或“b”,而“cccb”显然是不满足的。

3 正则表达式进阶