【问题标题】:Capture the latest in backreference捕获最新的反向引用
【发布时间】:2018-04-07 16:02:20
【问题描述】:

我有这个正则表达式

(\b(\S+\s+){1,10})\1.*MY

我想将第 1 组从

中捕获“名称”
The name is is The name MY 

我现在得到“是”。

名称可以是任意长度的任意单词。 它不必在一开始。 它只需要2或3个字。它可以少于 10 个单词。 唯一可以确定的是,这将是最后一组重复的单词。 例子:

The name is Anthony is is The name is Anthony - “The name is Anthony”。

印度是我的国家所有印度人都是印度是我的国家-“印度是我的国家”

Times of India Alphabet Google 是公司 Alphabet Google 食堂 - “Alphabet Google”

【问题讨论】:

  • 什么是“名字”?它是一个随机单词吗?假定的“名称”的长度是否总是小于 10 个字符?
  • 请提供一些更全面的示例输入和输出。
  • 很难从一个例子中看出你真正需要什么。平凡的(The name)(\s\S)*\s\1\sMY 与您的示例相匹配。如果这是不可接受的,为什么不呢?一个样本中可以有多少其他重复的字符串?我们可以依赖位置吗,比如^((\S+\s)+)(\S\s)*\1.*MY((\S+\s)+)(\S\s)+\1\sMY
  • 名字可以是任意长度
  • edit您的问题与这些澄清。不过,如何概括这一点仍不完全清楚。

标签: regex regex-group backreference


【解决方案1】:

你可以试试:

(\b\w+[\w\s]+\b)(?:.*?\b\1)

As demonstrated here

解释-

(\b\w+[\w\s]+\b) 是捕获组 1 - 这是重复的文本 - 由单词边界分隔。
(?:.*?\b\1) 是一个非捕获组,它告诉正则表达式系统匹配组 1 中的文本,仅当它后跟零个或多个字符、单词边界和重复文本时。

【讨论】:

  • 我非常感谢建设性的批评,但请发表反对的理由。
  • 谢谢。这有帮助
  • @user9474326 随时!另外,如果您觉得这篇文章确实有帮助,请考虑为该帖子点赞:)
【解决方案2】:

正则表达式通常捕获最长的 le|tmost 匹配。您的问题中没有任何示例表明这实际上不是您想要的字符串,但这可能只是意味着您没有找到好的示例来展示给我们。

不碍事,

((\S+\s)+)(\S+\s){0,9}\1

似乎符合您当前所述的要求。如果有例如,“最长的最左边”行为仍然可能会妨碍。跨越式重复,例如

this that more words this that more words

在一般情况下,单独的正则表达式不能轻易地总是优先选择最后一个可能的匹配并且容忍它之后的任意数量的文本。

【讨论】:

  • 感谢您的努力。 Coffeehouse Coder 的回答很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多