使用正则表达式删除文本文件中多余的空行
本文关键字:多余 文件 正则表达式 删除 文本 | 更新日期: 2024-09-25 15:13:36
嗨,我想删除源文本文件中多余的空行(这意味着如果有2行或更多空行,只保留1行空行)。我使用了这个模式:
^('s*('n|'r|'r'n)){2,}
它无法处理文件末尾的空行,如以下所示:
1. BlablablaCRLF
2. CRLF
3.
上面(第3行)是文件的末尾,VSStyleCop抱怨这里有多个空行。它看起来像是文件末尾的换行符,但实际上什么都没有,我在记事本++中打开了"显示所有字符",我本来希望在文件末尾看到一个CRLF,但它没有。我的模式无法识别这一点,如何处理这种情况?谢谢
基本答案
如果这是你想要匹配的:
- 多个连续空行,其中Multiple表示>1
- 文件末尾的所有空行,除了
'n
隐含生成的空行——终止文件(这可以被认为是一种很好的做法,请参阅此处) - 终止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'n
、abc'r'n
或abc'r
等所有允许的组合相匹配,因为's
还包括'n
和'r
。
'n
0匹配整个文件/输入的末尾(而$
只匹配一行的末尾)。
我确信可能会有一个较短版本的正则表达式,但我的第一个意图是让它起作用并易于理解。