2011-03-21 100 views
3

下面是一個簡單的代碼片段,演示了.Net正則表達式中行尾匹配(「$」)看似有問題的行爲。我錯過了明顯的東西嗎?

 string input = "Hello\nWorld\n"; 
     string regex = @"^Hello\n^World\n"; //Match 
     //regex = @"^Hello\nWorld\n"; //Match 
     //regex = @"^Hello$"; //Match 
     //regex = @"^Hello$World$"; //No match!!! 
     //regex = @"^Hello$^World$"; //No match!!! 

     Match m = Regex.Match(input, regex, RegexOptions.Multiline | RegexOptions.CultureInvariant); 
     Console.WriteLine(m.Success); 

回答

6

$不消耗換行字符(多個)。 @"^Hello$\s+^World$"應該匹配。

+0

需要在世界之後添加\ s *以獲得最後的\ n。 – gt124 2011-03-21 19:47:55

+0

@gt124,我認爲它會匹配無論如何,因爲'「^你好$」'匹配。 – 2011-03-21 19:49:51

+0

啊哈!感謝那。這關乎消費部分。謝謝。 – Nate 2011-03-21 19:56:52

1

$與換行符不匹配。它匹配應用模式的字符串的末尾(除非啓用多行模式)。在一個字符串中有兩個末端沒有多少意義。

+1

那麼,多線模式確實在提問者的代碼中被啓用了...... – 2011-03-21 19:52:15

+0

我認爲它應該匹配多行正則表達式(不是換行符)中的行尾。例如在紅寶石中,''Hello \ nWorld \ n「.match(/^Hello $ \ n^World $/m)'產生一個匹配。 – Ilkka 2011-03-21 19:53:14

+0

我很困惑,因爲MSDN文檔說Multiline導致^和$匹配開始和結束:「改變^和$的含義,使它們分別匹配任何行的開頭和結尾,而不僅僅是開頭和結尾整個字符串的末尾「。請參閱http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions.aspx – Nate 2011-03-21 20:00:04