使用正则表达式

时间:2016-04-17 07:20:11

标签: c# regex stylecop

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

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

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

1. BlablablaCRLF
2. CRLF
3. 

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

1 个答案:

答案 0 :(得分:1)

基本答案

如果这是您想要匹配的内容:

  1. 多个连续的空行,其中多个装置> 1。
  2. 文件末尾的所有空行除\n隐含生成的行外 - 终止文件(可以认为是一种好习惯,请参阅here)。
  3. 终止\n后的所有冗余空格。
  4. 然后这种模式可能对你有帮助:

    (^\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\nabc\r\nabc\r等每个允许的组合相匹配,因为\s还包含\n和{ {1}}。

    \r匹配整个文件/输入的结尾(而\Z只匹配一行的结尾)。

    我确信正则表达式的版本可能更短,但我的第一个目的是让它工作和理解。