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

时间:2013-04-29 23:23:36

标签: regex notepad++

我在这里看到了一些可能对我有帮助的答案,如果我将它们组合在一起但我似乎无法弄清楚如何正确地做到这一点。

让我们假设我们有一个以下文本文件:

aaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaa
[a]
aaaaaaaaaaaaaaaaaaaaaaaaaaaaa[h]
aaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

[a]
aaaaaaaaaaaaaaaaaaaaaaaa[h]
aaaaaaaaaaaaaaaaaaaaaaaaaaa

其中:

  • “a”字面意思是任何字符(或字符集),包括特殊符号,unicode字符等。
  • “h”是固定的拉丁字符
  • 括号表示括号
  • 空白行是一个空行

然后:

  • 如何只保留[h]行,用银行线代替其他所有内容? (意味着回车仍然存在)
  • 如何保留相同的行但删除[h]?
  


  
  
  
  aaaaaaaaaaaaaaaaaaaaaaaaaaaaa并[h]
  
  
  
  
  aaaaaaaaaaaaaaaaaaaaaaaa并[h]
  

正如标题所说,我想我需要的内容也可以描述为:替换除了与给定表达式匹配的行之外的任何行。

1 个答案:

答案 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]的行最后。