1

我刚刚问了一个与此类似的问题,并且有一个出色而准确的答案,但事实证明我现在遇到了一个全新的问题。原来我有一行相关的输入。我不确定如何以抽象的方式问这个问题,所以我将直接进入我的输入:

已编辑以提供更好的示例

bear999bear888bear777bear666fox---bear222bear333bear444bear555fox

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

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

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

它返回444。有没有办法可以调整它以返回444 和 777?它似乎跳过了第一场比赛,只支持后者。我有排除,使其仅匹配左侧的最里面。

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

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

任何意见,将不胜感激!

4

2 回答 2

1

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

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

它读起来像“让我们匹配前面的东西,里面bear没有bear序列,后面跟着bear- 没有bear-fox序列”。

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

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

于 2012-10-17T00:48:24.700 回答
0

你的第一个.*是贪婪的。这将起作用:

xxx.*?xxx.*?xxx(?<matchString>.*?)xxx.*?yyy
于 2012-10-16T23:07:57.510 回答