想象一下,我有一个充满 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),所以任何答案都应该包含一个解决方案。如果另一个环境允许更优雅的解决方案,也可以随意添加。
答案 0 :(得分:2)
您可以使用tempered greedy token正则表达式,该正则表达式匹配Cat
到dog
中不包含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
允许新行在其后面。)