请问,正则表达式的这个"|"符号

rrrrr32 2012-03-08 11:29:24
正则表达式:(19|20)\d{2}


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

"|"符号为什么选择的是19或20,不是选择9或2呢?照理说应该是9或2啊?
...全文
137 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
-过客- 2012-03-08
  • 打赏
  • 举报
回复
参考

正则表达式学习参考

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

举例:

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

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

3 正则表达式进阶
q107770540 2012-03-08
  • 打赏
  • 举报
回复
() 表捕获组

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

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


(?n)(19|20)\d{2}
pmars 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 rrrrr32 的回复:]

引用 3 楼 pmars 的回复:

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

你只说了:
只要碰不到结束 的)
没有说前面的(是怎么回事?
[/Quote]
一个正确的正则肯定得有前面的括号啊,所以就没有细说
19|20\d{2} 这个分为19 and 20\d{2}
(19|20)\d{2} 这个分为19\d{2} and 20\d{2}
以此类推
| 的范围就是延伸到正则边界,或者括号边界,或者下一个|
rrrrr32 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pmars 的回复:]

总结一下就是:| 只要碰不到结束的)或者下一个|的话,就会往下去匹配,知道匹配不上为止,也就是一个贪婪的模式
1L 说的这个
19|20\d{2}
会匹配 19 或 20\d{2}
[/Quote]
你只说了:
只要碰不到结束 的)
没有说前面的(是怎么回事?
pmars 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chinajiyong 的回复:]

引用 1 楼 caozhy 的回复:

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

我来详细解释一下
就是()的原因,()一般表达子表达式
(19|20)会把19 20 当做两个整数,19和20,你如果把19、20放在()外面那就职匹配到9和2了,相当于[92].这也是()的最大用处
[/Quote]
3L 的东西是刚才研究了一下总结的

2L说的
你如果把19、20放在()外面那就职匹配到9和2了,相当于[92].这也是()的最大用处
这句话是什么意思?
把19、20放在()外面
这个是怎么放的?具体正则写成什么样?
我没有搞明白,呵呵
pmars 2012-03-08
  • 打赏
  • 举报
回复
总结一下就是:| 只要碰不到结束的)或者下一个|的话,就会往下去匹配,知道匹配不上为止,也就是一个贪婪的模式
1L 说的这个
19|20\d{2}
会匹配 19 或 20\d{2}
EnForGrass 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 caozhy 的回复:]

19|20\d{2}
这样是9或者2。
[/Quote]
我来详细解释一下
就是()的原因,()一般表达子表达式
(19|20)会把19 20 当做两个整数,19和20,你如果把19、20放在()外面那就职匹配到9和2了,相当于[92].这也是()的最大用处
threenewbee 2012-03-08
  • 打赏
  • 举报
回复
19|20\d{2}
这样是9或者2。
pmars 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lxcnn 的回复:]

参考

正则表达式学习参考

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

举例:

“^aa|b$”在匹配“cccb”时,是可以匹配成功的,匹配的结果是“b”,因为……
[/Quote]

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧