正则"|"操作符

windboyzsj 2009-10-26 12:21:22
你们猜猜下面打印出来的是什么?

Console.WriteLine(Regex.Match("abcaa", "(bc(?<name>.*))|(ab(?<name>.*))").Groups["name"].Value);

结果是"caa"

MSDN上说"|"会返回左边的结果,为什么这里是右边的呢?这个两个分支单独匹配都成功。
...全文
96 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
-过客- 2009-10-26
  • 打赏
  • 举报
回复
分析匹配过程就是了

从位置0处开始尝试匹配,首先由左侧表达式
(bc(?<name>.*))
尝试匹配,由“b”匹配“a”,匹配失败,左侧表达式匹配失败
此时尝试下一个分支,也就是右侧表达式
(ab(?<name>.*))
尝试匹配,由“a”匹配“a”,匹配成功,继续尝试匹配,右侧表达式匹配成功,此时的name捕获组匹配到的就是“caa”

我没看过MSDN上关于这一部分的介绍,但这里说的返回左边结果,应该是成功匹配的最左边的结果,如果左侧分支不能成功匹配,自然是向右侧分支尝试的。自左向右尝试匹配,逐个分支尝试,只要有一个分支匹配成功,就不再向右尝试匹配,这是传统NFA引擎的特点

这两个分支单独匹配都能成功,但要看是在哪个位置,在位置0处,自然是右侧分支匹配成功,而左侧分支匹配失败了

PS:基本上不怎么看MSDN上关于正则的介绍,因为不太习惯看大篇的英文,中文关于正则这一部分翻译得几乎没法看,太乱了,名词跟绕口令一样。。。

110,534

社区成员

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

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

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