为什么这个正则表达式只返回一个匹配?

时间:2012-10-16 21:33:57

标签: c# .net regex regex-greedy non-greedy

以下是我的意见:

  

xxx999xxx888xxx777xxx666yyy

     

xxx222xxx333xxx444xxx555yyy

这是表达式:

xxx.*xxx(?<matchString>(.(?!xxx.*xxx))*?)xxx.*yyy

它返回 444

我希望它能同时返回444和777,但我不能随便找到它。

我有排除,因此它只匹配左侧的最里面(当我只搜索一个结果时,这很有效,大部分时间都是如此)。但是,我感觉这与它在此实例中跳过第一个结果的原因有关。我不知道从哪里开始。

我一直在这里测试: http://regexlib.com/RETester.aspx(已启用“SingleLine”和“Explicit Capture”)

任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:5)

首先,我想解释一下为什么你当前的解决方案不起作用:

由于您已启用SingleLine选项,.*匹配999xxx888xxx777xxx666yyy\nxxx222xxx333,括号中的模式与444匹配,其余正则表达式匹配xxx555yyy

为了匹配777444,您可以禁用SingleLine选项或使用以下内容:

xxx\d+xxx\d+xxx(?<matchString>\d+)xxx\d+yyy