2

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

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

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

[a]
aaaaaaaaaaaaaaaaaaaaaaaa[h]
aaaaaaaaaaaaaaaaaaaaaaaaaaa

在哪里:

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

然后:

  • 我如何只保留最后带有 [h] 的行,用银行行替换其他所有内容?(表示回车仍然存在)
  • 如何保持相同的行但也删除 [h]?





啊啊啊啊啊啊啊啊




啊啊啊啊啊啊啊啊[h]

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

4

1 回答 1

2

找什么:

^.*$(?<!\[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

请注意,环视不是匹配的一部分。因此,^.*$只需确保您匹配整行而不是其中的一部分,也不是多行。然后,lookbehind 确保匹配的行没有以[h].

[h]然后,您可以通过额外的步骤删除:

找什么:\[h\]$

什么都换。

编辑:由于正则表达式引擎从头到尾遍历文件以及匹配永远不会重叠的事实,您实际上可以将两种模式合二为一:

^.*$(?<!\[h\])|\[h\]$

[h]行尾的 a 被删除时,引擎将不会再查看该行,因此您只剩下曾经[h]在末尾有 an 的行。

于 2013-04-29T23:59:51.570 回答