【问题标题】:Regex for getting the first occurring matching pair用于获取第一个出现的匹配对的正则表达式
【发布时间】:2013-09-08 23:33:35
【问题描述】:

鉴于您可以在正则表达式模式中引用捕获组,是否可以在 lookbehind 中使用所述捕获组?

如果你有字符串

"monkeys eat bananas, bananas are terrified of monkeys"

bananas 是第一个匹配的词对,monkeys 是第一个匹配的词。我可以毫无问题地得到猴子

(\w+).*\1 # returns monkeys

但如果我想得到最先匹配的单词,我需要能够做这样的事情

(?<=\1)(\w+)

但是,这失败了,我猜的原因很简单,当评估 lookbehind 时,\1 没有任何意义。是否还有一些我还没有遇到过的正则表达式魔法,可以让我匹配这样的东西?

【问题讨论】:

  • 首先匹配你期待什么?
  • 我正在尝试获取第一个匹配对,因此在我的示例中,香蕉在猴子之前重复,因此返回了香蕉。

标签: regex


【解决方案1】:

许多正则表达式引擎需要反向引用出现在它们引用的组之后(请参阅我的related question,了解 .NET 中的这种行为)

尝试改用前瞻:

(\w+)(?=.*\1)

【讨论】:

  • 这不相当于(\w+).*\1吗?即(\w+) 匹配猴子,然后lookahead 看到猴子重复了吗?
  • @miah 不完全是。在(\w).*\1 中,整个匹配由两个实例之间的整个字符串组成(仅在组中捕获第一个实例)。使用前瞻,整个匹配只包含第一个实例。这意味着给定您上面的示例,此模式将匹配 monkeysbananas(您的将仅匹配 monkeys)。
猜你喜欢
  • 2022-08-13
  • 2016-03-18
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
相关资源
最近更新 更多