regex - 在 Notepad++ 中,使用正则表达式替换除与给定表达式匹配的行之外的所有行

标签 regex notepad++

我在这里看到了一些答案,如果我将它们组合在一起可能会对我有所帮助,但我似乎不知道如何正确地做到这一点。

假设我们有以下文本文件:

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/

相关文章:

数字列表的 Java Regex 验证

java - java中空格后取字符

regex - Notepad++ 忽略正则表达式的结束分隔符

macros - 宏,自动给值加一

notepad++ - 如何使用 Notepad++ 在选定文本中执行查找/替换

带有 ^ 符号的 Java 正则表达式 : find from position

regex - 如何获取/提取 Google 表格单元格的链接和文本?

regex - 匹配信用卡到期日期的正则表达式

text - Notepad++ 自动完成文本文件调整?

regex - Notepad++ 可以将搜索结果保存到文本文件吗?