匹配两个关键词之间的文本块,但如果关键词在两个关键词之间则不匹配

时间:2016-03-15 09:47:59

标签: regex notepad++

想象一下,我有一个充满 cat 诗的文本文件,需要找到以 dog 这个词结尾的所有诗歌。诗歌都以 cat 这个词开头。我如何仅匹配以 cat 开头并以 dog 结尾的诗?

Cat poem: 
My feline is very furry
I like furry felines
This is why I do not have a dog

Cat poem:
Littly furry paws
this is what i like
I don't care if it's a feline or a canine

Cat poem:
The little felines
playing in the field
sitting on the side watching is a dog

在我的例子中,我想要匹配第一首和最后一首诗,而不应匹配中间。如果所有诗歌以 dog 结尾,(?=cat).*?(?<=dog)将是一个简单的解决方案(感谢this answer)。然而,这首先匹配第一首诗,然后匹配第二首和第三首诗(因为第二首诗中没有 dog )。我试过的那个正则表达式的任何扩展产生了相同的结果,例如(?=cat).*?(?!cat).*?(?<=dog)

我正在使用Notepad ++(v6.5.2),所以任何答案都应该包含一个解决方案。如果另一个环境允许更优雅的解决方案,也可以随意添加。

1 个答案:

答案 0 :(得分:2)

您可以使用tempered greedy token正则表达式,该正则表达式匹配Catdog中不包含Cat的子字符串:

^Cat\b(?:(?!^Cat\b).)*\bdog\b(?=\R+Cat\b|\z)
必须选中

.匹配换行符选项。请参阅regex demo here

模式分解:

  • ^ - 开始行
  • Cat\b - 全文Cat
  • (?:(?!^Cat\b).)* - 与线条开头不是整个单词Cat的任何文字匹配的驯化贪婪令牌
  • \bdog\b - 整个字dog ...
  • (?=\R+Cat\b|\z) - 后面跟着1 +换行序列(\R+),然后是整个词Cat,或者文件的末尾\z\Z是整个字符串结尾锚,只有\Z允许新行在其后面。)

enter image description here