匹配两个词之间的内容但不包括这两个词 - notepad++

3

输入:

start
some
T1
random
T2
text
T3
end

应该得出以下结果:
start
T1
T2
T3
end

我尝试使用

标签


>(?<=start)[\S\s]*?(?=end)

匹配起始和结束之间的所有内容:

并排除 T1 T2 T3 使用:

^(?!T\d)

是否可能将它们合并为单个正则表达式,以便不熟悉编写代码的人可以将其粘贴到notepad++中一次性完成?


不,一次性做不到。使用Python脚本更容易实现。此外,可以编写正则表达式,但需要多次使用“Replace All”来删除所有不必要的“Tn”行,然后再使用正则表达式抓取“start\K(?s:.*?)(?=end)”。 - Wiktor Stribiżew
1个回答

2
您可以使用以下正则表达式: 查找:^(?!T\d|start).*\R(?=(^(?!start$).*\R)*end$)
替换:(空)
. 匹配换行符:
点击“全部替换”。
假设满足以下条件:
  • startend定界符应该分别是它们所在行上唯一的文本(所以不是---startstart ///等),
  • 它们应该按照正确的顺序成对出现(首先是start,然后是end
  • 它们不应该嵌套,所以在一个start之后不能再出现另一个start,直到您有一个end
由于每次匹配都需要再次检查其后面的文本直到下一个end,因此前瞻使这个正则表达式变得相当低效。

谢谢,也感谢您指出了限制。不过有一个问题,即当在“开始”分隔符之前有超过50行时,文本文件中的所有内容都会被匹配。即使每50行都相同,这种情况仍然存在。 - Tortenrandband
我再次尝试,限制不是50,而是191。我通过在分隔符开始之前添加191行“TEST”来尝试。为什么会这样? - Tortenrandband
这看起来像是Notepad++的限制,因为在正则表达式本身中绝对没有这样的原因。我猜测前瞻在一定数量的行和/或字符后被中止了,这是不应该发生的。 - trincot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接