2012-10-15 48 views
1

我試圖找到一個C#兼容的正則表達式來匹配所有多餘的換行符 - 包括空/只有空白線 - 允許更換:正則表達式匹配所有多餘的和尾隨的換行符

 

first line 
    second line 

third line 

,如:

 
first line 
    second line 
third line 

沒有任何尾隨的換行符。

衆所周知的多行^\s*$確實不是匹配上一個換行符。

我能拿出(?<!\S+)\r\n|(\r\n)+\z其中:

  1. 的作品,無論是在單行和多行模式
  2. 是醜陋的,可能緩慢

當時任何人能夠拿出一個簡單的正則表達式來做同樣的事情嗎?

回答

4

原因是,如果最後一行中沒有任何內容,那麼$匹配字符串末尾的\n

對於換行符\n後在比賽

之間
^\s*^ 

^的空行。所以這匹配從一行開始到下一行的空格。

對於最後一個空行,你需要從過去的換行符之前的所有空格來匹配,直到本場比賽必須出現在字符串

$\s*\z 

,並結合

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

\z結束字符串末尾

請參閱Anchors on 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(); 
+0

我嘗試了很多這些變體,並且所有 - 包括你的 - 似乎都有效,但忽略文本中的最後一個換行符。 –

+0

@ViktorSvub,我做了一些測試並改變了我的答案。 – stema

+0

根據我的測試,這幾乎是OK :)它只需要修改,不留下掛在最後的'\ r': '^ \ s *^| \ r $ \ s * \ z' –

1

爲了擺脫尾隨的換行符的,怎麼樣的混合方法:

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

簡單性和可讀性。

+0

I知道這種可能性,但我想知道是否有一種方法可以純粹使用C#兼容的正則表達式。 –

+0

對不起,我個人不喜歡使用交替,但是這個工作:'@「^ \ s + $ | \ s + \ z」'(替換上面的模式)。 +1爲@stema - 很好的解釋和鏈接錨點。 – kuujinbo

相關問題