我在这里看到了一些可能对我有帮助的答案,如果我将它们组合在一起但我似乎无法弄清楚如何正确地做到这一点。
让我们假设我们有一个以下文本文件:
aaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaa
[a]
aaaaaaaaaaaaaaaaaaaaaaaaaaaaa[h]
aaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[a]
aaaaaaaaaaaaaaaaaaaaaaaa[h]
aaaaaaaaaaaaaaaaaaaaaaaaaaa
其中:
然后:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaa并[h]
aaaaaaaaaaaaaaaaaaaaaaaa并[h]
正如标题所说,我想我需要的内容也可以描述为:替换除了与给定表达式匹配的行之外的任何行。
答案 0 :(得分:1)
找到:
^.*$(?<!\[h\])
什么都不替换。请务必取消选中. matches newline
。
它是如何运作的?
^ # 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]
的行最后。