2

我试图找到一个与 C# 兼容的正则表达式来匹配所有多余的换行符——包括空行/仅空白行——允许替换:

第一行
    第二行

第三行

喜欢:

第一行
    第二行
第三行

没有任何尾随换行符。

众所周知的多行^\s*$匹配最后一个换行符。

我能够想出(?<!\S+)\r\n|(\r\n)+\z

  1. 工作,在单线和多线模式
  2. 很丑而且可能很慢

有没有人能想出一个简单的正则表达式来做同样的事情?

4

2 回答 2

5

原因是,如果最后一行没有任何内容,则匹配字符串末尾的$a 之前。\n

对于中间的空行

^\s*^

^在换行符之后匹配\n。所以这匹配从一行开始到下一行的空白。

对于最后一个空行,您需要从最后一个换行符之前匹配所有空格,直到字符串末尾

$\s*\z

并结合

^\s*^|$\s*\z

\z匹配必须出现在字符串的末尾

请参阅msdn 上的锚点

我的测试:

string s = "This is the first row\n\nThis is the third\n    \nThis the fifth\n";

string result = Regex.Replace(s, @"^\s*^|$\s*\z", "", RegexOptions.Multiline);
Console.WriteLine(result);

Console.WriteLine("fin");
Console.ReadLine();
于 2012-10-15T12:37:06.117 回答
1

为了摆脱尾随的换行符,混合方法怎么样:

Regex.Replace(input, @"^\s+$", "", RegexOptions.Multiline).TrimEnd()

简单易读。

于 2012-10-15T18:15:28.690 回答