我在这里看到了一些答案,如果我将它们组合在一起可能会对我有所帮助,但我似乎不知道如何正确地做到这一点。
假设我们有以下文本文件:
aaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaa
[a]
aaaaaaaaaaaaaaaaaaaaaaaaaaaaa[h]
aaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[a]
aaaaaaaaaaaaaaaaaaaaaaaa[h]
aaaaaaaaaaaaaaaaaaaaaaaaaaa
地点:
- “a”字面意思是任何字符(或字符集),包括特殊符号、Unicode 字符等。
- “h”是固定拉丁字符
- 括号表示括号
- 空行就是空行
然后:
- 如何仅保留末尾带有 [h] 的行,并将其他所有行替换为银行行? (表示保留回车符)
- 如何保留相同的行并删除 [h]?
aaaaaaaaaaaaaaaaaaaaaaaaaaaaa[h]
aaaaaaaaaaaaaaaaaaaaaaaa[h]
正如标题所说,我想我需要的也可以描述为:替换除与给定表达式匹配的行之外的任何行。
最佳答案
查找内容:
^.*$(?<!\[h\])
替换为任何内容。确保取消选中。匹配换行符
。
它是如何工作的?
^ # matches the beginning of a line (after the line break)
.* # matches as many non-line-break characters as possible (an entire line)
$ # matches the end of a line (before the line break)
(?<! # a negative lookbehind, if it's contents match left of the current
# position, it causes the pattern to fail
\[h\] # match [h] literally
) # end of lookbehind
请注意lookarounds不属于比赛的一部分。因此 ^.*$
只是确保您匹配整行而不是其中的一部分,也不是多个行。然后,lookbehind 确保匹配的行没有以 [h]
结束。
然后,您可以通过附加步骤删除 [h]
:
查找内容:\[h\]$
什么都不替换。
编辑:由于正则表达式引擎从头到尾遍历文件,并且匹配永远不会重叠,因此您实际上可以将两种模式合并为一个:
^.*$(?<!\[h\])|\[h\]$
当行尾的 [h]
被删除时,引擎将不会再次查看该行,因此您只剩下曾经有一个 [h]
的行[h]
位于末尾。
关于regex - 在 Notepad++ 中,使用正则表达式替换除与给定表达式匹配的行之外的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16289848/