【问题标题】:Regex match string between same words相同单词之间的正则表达式匹配字符串
【发布时间】:2021-02-14 12:52:58
【问题描述】:

我正在尝试从大型文本文档中捕获特定模式。这种模式非常简单——如果一行以一个单词开头并以同一个单词结尾,我想捕获那一行。 例如:

phase1 begin trial end phase1
phase2.begin distribution end phase2
phase3 allow buying in phase3 but
phase4 has no end
phase5 is test of phase

在本文档中,我希望在第 1 行和第 2 行得到匹配,因为这两行都以相同的单词 [a-zA-Z0-9] 开头,因此第 3 行不应该匹配,因为它没有结束使用相同的单词(尽管它在字符串中具有相同的单词),第 4 行和第 5 行甚至根本没有第一个单词。 我尝试使用模式:

^([a-zA-Z0-9]*\b)(.+)(\b\1)$

它应该在反向引用之后强制字符串结束,但它在所有五行上都匹配(不匹配组,但每行都有一个完全匹配)。我认为我缺少对正则表达式的一些基本理解,因为我无法理解如何强制它匹配这个特定的模式,如果有人能解释我的想法中的缺陷会很有帮助。

我试图寻找这种模式,但大多数人都试图匹配已知单词,这里的复杂性是我想匹配任何行,只要它以任意单词开头并以它结尾(例如,可能有N 个阶段或文档中写入的任何其他任意单词)。我正在使用 regex101 来测试我的模式匹配。

【问题讨论】:

  • 字符类不应该是可选的^([a-zA-Z0-9]+)\b(.+)\b(\1)$regex101.com/r/Y2uHdt/1
  • @Thefourthbird 这是我做过的最愚蠢的错误,请你写一个答案以便我标记它。如果您有耐心/有时间,您能否解释为什么即使在我添加 \b 之后它仍然匹配所有字符(应该在第一个空格处停止?)以及为什么它仍然匹配行,如果它包含第一个单词中的所有字符(为什么没有最后不需要至少 1 个反向引用吗?)谢谢。

标签: regex


【解决方案1】:

它匹配整个字符串的原因是第一个b和字符串的开头之间有一个单词边界。

发生的情况是正则表达式将回溯,直到它可以在字符串末尾匹配反向引用(一个空字符串),并且捕获组 2 将包含整个字符串,正如您在 the right panel 中看到的那样。

(.+) 预计至少匹配 1 个字符,末尾的 \1 指的是在第 1 组中捕获的内容,它是一个空字符串。

要只匹配the first 2 strings,可以使字符类至少匹配一个或多个字符[a-zA-Z0-9]+

【讨论】:

    【解决方案2】:

    你也可以试试

    ^phase\d.*phase\d$

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-23
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 2020-10-19
      • 2011-12-13
      • 2021-09-21
      相关资源
      最近更新 更多