使用正则表达式删除文本文件中多余的空行

本文关键字:多余 文件 正则表达式 删除 文本 | 更新日期: 2024-09-25 15:13:36

嗨,我想删除源文本文件中多余的空行(这意味着如果有2行或更多空行,只保留1行空行)。我使用了这个模式:

^('s*('n|'r|'r'n)){2,}

它无法处理文件末尾的空行,如以下所示:

1. BlablablaCRLF
2. CRLF
3. 

上面(第3行)是文件的末尾,VSStyleCop抱怨这里有多个空行。它看起来像是文件末尾的换行符,但实际上什么都没有,我在记事本++中打开了"显示所有字符",我本来希望在文件末尾看到一个CRLF,但它没有。我的模式无法识别这一点,如何处理这种情况?谢谢

使用正则表达式删除文本文件中多余的空行

基本答案

如果这是你想要匹配的:

  1. 多个连续空行,其中Multiple表示>1
  2. 文件末尾的所有空行,除了'n隐含生成的空行——终止文件(这可以被认为是一种很好的做法,请参阅此处)
  3. 终止CCD_ 2

那么这个模式可能会对你有所帮助:

(^'s*('r|'n)){2,}|^'s+('r|'n)?'Z

进一步解释

第一部分(^'s*('r|'n)){2,}负责1。第二部分^'s+('r|'n)?'Z匹配文件末尾的冗余空行或终止'n之后的冗余空白。

如果你的文件是这样的(以Unix文件结尾)。。。

1. FirstLine'n
2. 
3. ThirdLine'n
4. FourthLine'n
5.
6.
7. SeventhLine'n

那么它只匹配第5行和第6行,但在末尾没有匹配。不过,由于'n终止,记事本++将在末尾显示第8行。然而,如果在文件末尾有多个'n,或者如果在第7行中的终止'n之后有额外的't或空格,则它们将匹配。

如果您还想匹配'n终止生成的行(因此在替换时删除'n终止),那么您也可以将^'s*'Z用于正则表达式的第二部分。

's*('r'n)的附加说明:这与abc'nabc'r'nabc'r等所有允许的组合相匹配,因为's还包括'n'r

'n0匹配整个文件/输入的末尾(而$只匹配一行的末尾)。

我确信可能会有一个较短版本的正则表达式,但我的第一个意图是让它起作用并易于理解。