正则表达式删除尾随空格和多个空行

时间:2015-07-29 15:40:28

标签: c# .net regex visual-studio-2013

我希望在用C#编写的Visual Studio 2013扩展中使用正则表达式。

我试图在保留空行的同时从一行删除尾随空格。我也想删除多个空行。应保留现有的行结尾(通常是回车换行)。

所以下面的文字(显示为下划线的空格):

hello_world__


___hello_world_
__
__
hello_world

会变成:

hello_world

___hello_world

hello_world

我尝试了许多不同的模式来删除尾随空格,但我最终没有匹配尾随空格或丢失回车符。我还没有尝试删除多个空行。

以下是我迄今为止尝试过的几种模式:

\s+$

(?<=\S)\s+$

6 个答案:

答案 0 :(得分:1)

使用

删除多个空白行和尾随空格
(?:\r\n[\s-[\rn]]*){3,}

并替换为\r\n\r\n

请参阅demo

要删除剩余的空格,可以使用

(?m)[\s-[\r]]+\r?$

请参阅demo 2

答案 1 :(得分:1)

\ +(?=(\n|$))

任意数量的空格,并在换行符或行结束后检查(字符串/文本中的最后一个字符)。 (当然需要启用多行和全局模式)

答案 2 :(得分:1)

感谢目前为止的答案。它们都不适合我需要的东西,但它们帮助我提出了我需要的东西。我认为问题在于VS2013中的正则表达式有些奇怪(见Using Regular Expressions in Visual Studio)。这两项操作对我有用:

\ +(?=(\n|\r?$))替换为空。

^\r?$(\n|\r\n){2,}替换为\r\n

答案 3 :(得分:1)

就像没有使用正则表达式一样,你可以随时将文档拆分为行尾标记,然后使用TrimEnd进行反馈(正如Anton Semenov所强调的那样)......

(假设文本文档被读成字符串......)

//  Ascertain the linefeed...
string str = "This is a test    \r\nto see if I can force   \ra string to be broken \non multiple lines           \r\n into an array.";
string[] t = str.Split(new string[] { "\r\n", "\r", "\n" } ,StringSplitOptions.RemoveEmptyEntries);
thediv.InnerHtml = str + "<br /><br />";
foreach(string s in t)
{
    thediv.InnerHtml += s.TrimEnd() + "<br />";
}

我根本没有计时,但如果你更愿意避免使用正则表达式的复杂功能(如果可以的话,我会这样做 - 见下文*),你应该找到足够快的速度来做你想做的事。

*如果可以,我会避免正则表达式。这并不意味着我不使用它。 Regex有它的位置,但我相信它是涉及工作的最后手段工具,例如符合格式的复杂灵活字符串 - 替代方案将生成大量代码。将正则表达式保持在绝对最小值有助于提高代码的可读性。

答案 4 :(得分:0)

\s包含换行符,我只会搜索多个空格。我不知道VS的细节,但希望这样做:

[" "]*?$

答案 5 :(得分:0)

作为单独的操作 -

删除任何(?m)[^\S\r\n]+$的尾随空格 删除带有文本(?m)(?<=\S)[^\S\r\n]+$

的尾随空格行

删除重复的空行(以及空格修剪)

    # Find: (?>\A(?:[^\S\r\n]*\r\n)+)|(?>\r\n(?:[^\S\r\n]*(\r\n)){2,})
    # Replace: $1\r\n


    (?>
         \A 
         (?: [^\S\r\n]* \r \n )+
    )
 |  
    (?>
         \r \n 
         (?:
              [^\S\r\n]* 
              ( \r \n )                     # (1)
         ){2,}
    )