【问题标题】:why is this single-line regex not returning ALL matches?为什么这个单行正则表达式不返回所有匹配项?
【发布时间】:2012-10-07 03:24:46
【问题描述】:

我刚刚问了这个问题similar question,得到了一个非常准确的答案,但事实证明我现在遇到了一个全新的问题。原来我有一个相关输入的单行。我不知道如何以抽象的方式提出这个问题,所以我将直接进入我的输入:

(已编辑以提供更好的示例)

bear999bear888bear777bear666fox---bear222bear333bear444bear555fox

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

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

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

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

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

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

任何建议将不胜感激!

【问题讨论】:

  • 我们可以说xxx[^xy]+yyy 是这里的结束分隔符吗?看,在这个特定的例子中,/([^x]+?)(?=xxx[^xy]+yyy)/g 模式就足够了......
  • @raina77ow - 谢谢。我不确定我是否完全遵循,但分隔符实际上是一个组,而不是特定字符(在另一个示例中,它可能是“ABC”)。我有点喜欢正则表达式,所以我不太确定如何将这些信息转化为您的想法。
  • 无论您对正则表达式有多少经验(或没有)都没有关系。 ) 关键点始终是定义两组数据:一组应该匹配(或被捕获),另一组不应该匹配。说了这么多,能不能展示一下我展示的正则表达式不能正确处理的字符串?
  • @raina77ow - 例如,xxx999xxx888xxx777x000xxx666yyy---xxx222xxx333xxx444xxx555yyy,应该返回 777x000 和 444。感谢您的帮助。
  • @raina77ow - 我刚刚更新了问题,改用“熊”和“狐狸”。我在示例中使用相同的重复字符引入了一些混淆(我试图保持它的可读性但让它变得更糟)。

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


【解决方案1】:

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

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

它读起来像“让我们匹配前面有bear,没有bear 序列,后面是bear - 没有bear - fox 序列”。

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

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

【讨论】:

  • 感谢您的帮助,非常感谢。
【解决方案2】:

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

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

【讨论】:

  • 谢谢。不幸的是,我需要这个来选择最里面的匹配。我认为您的示例不允许使用诸如 xxx1xxx2xxx3xxx4xxx5xxx6yyy 之类的场景,在这种情况下它将返回“3”而不是所需的“5”。
  • “最内层匹配”是 5 的哪一种方式?
  • xxx.*?xxx.*?xxx 将匹配 xxx1xxx2xxx,它离左边太远,并导致匹配“3xxx4xxx5”。我正在寻找表达式的最内层匹配,它将匹配 xxx3xxx4xxx,这将导致“5”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
相关资源
最近更新 更多