我正在尝试从大型文本文档中捕获特定模式。这种模式非常简单 - 如果该行以一个单词开头并以同一个单词结尾,我想捕获该行。 例如:
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 来测试我的模式匹配。
答案 0 :(得分:1)
它匹配整个字符串的原因是第一个 b
和字符串的开头之间有一个单词边界。
发生的情况是正则表达式将回溯,直到它可以适合字符串末尾的反向引用(一个空字符串),并且捕获组 2 将包含整个字符串,如您在 the right panel 中看到的匹配项.
(.+)
期望匹配至少 1 个字符,最后的 \1
指的是组 1 中捕获的内容,这是一个空字符串。
要只匹配the first 2 strings,可以让字符类至少匹配一个或多个字符[a-zA-Z0-9]+
答案 1 :(得分:0)
你也可以试试这个
^phase\d.*phase\d$