为什么这个单行正则表达式没有返回所有匹配?

时间:2012-10-16 22:54:16

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

我刚刚向similar question询问了这个,并且有一个非常准确的答案,但事实证明我现在有一个全新的问题。事实证明我有一个单行相关输入。我不确定如何以抽象的方式提出这个问题,所以我会直接进入我的输入:

已编辑以提供更好的示例

  

bear999bear888bear777bear666fox --- bear222bear333bear444bear555fox

(标记之间的项目不一定是数字)

这是表达式(已编辑以匹配更新的输入示例):

bear.*bear(?<matchString>(.(?!bear.*bear))*?)bear.*fox

它返回 444 。有没有办法我可以调整它以返回 444和777 ?这似乎是跳过第一场比赛而只偏向后者。我有排除,因此它只匹配左侧的最里面。

我一直在这里测试: http://regexlib.com/RETester.aspx

当我将其分成两行并打开多行时,这很有用。当输入在一行时,为什么它会停止工作?

任何建议都将不胜感激!

2 个答案:

答案 0 :(得分:1)

这应该有用(它在你在问题中链接的正则表达式测试器中有效):

(?<=bear)(?:(?!bear).)*(?=bear(?:(?!bear).)*fox)

它的内容类似于“让我们匹配前面有bear的内容,其中没有bear个序列,后跟bear - 没有bear - {{ 1}}序列“。

这里没有捕获组;整场比赛就是你所需要的。

是的,我不禁想知道为什么要用一个正则表达式来实现它实际上看起来像是一个标记器的工作。 )例如,您可以先将fox分割,然后将每个部分拆分为'fox' - 并在每个结果的最后一个之前取一个。

答案 1 :(得分:0)

你的第一个.*贪婪。这将有效:

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