您好我想删除源文本文件中的额外空行(这意味着如果有2个或更多空行只保留1个空白行)。我使用了这种模式:
^(\s*(\n|\r|\r\n)){2,}
它无法处理文件末尾的空行,如下所示:
1. BlablablaCRLF
2. CRLF
3.
上面(第3行)是文件的结尾,VS StyleCop抱怨这里有多个空白行。它看起来像文件末尾的换行符,但实际上没有任何内容,我打开了#34;显示所有字符"在记事本++中,我希望在文件末尾看到一个CRLF,但它没有。我的模式无法识别这个,如何处理这种情况?谢谢!
答案 0 :(得分:1)
如果这是您想要匹配的内容:
\n
隐含生成的行外 - 终止文件(可以认为是一种好习惯,请参阅here)。\n
后的所有冗余空格。然后这种模式可能对你有帮助:
(^\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行,但最后没有任何内容。 Notepad ++虽然会因终止\n
而在结尾显示第8行。但是,如果文件末尾有多个\n
,或者在第7行终止\t
后会有其他\n
或空格,那么theese会匹配。< / p>
如果您还想匹配\n
终止生成的行(并因此在替换时删除\n
终止),您也可以使用^\s*\Z
代替正则表达式的第二部分。
\s*(\r\n)
的其他说明:这与abc\n
,abc\r\n
或abc\r
等每个允许的组合相匹配,因为\s
还包含\n
和{ {1}}。
\r
匹配整个文件/输入的结尾(而\Z
只匹配一行的结尾)。
我确信正则表达式的版本可能更短,但我的第一个目的是让它工作和理解。