2013-02-15 46 views
4

承諾,我的正則表達式問題的最後一段時間。 ..真。正則表達式 - 它不應該與NewLine匹配嗎?

我不知道如何在某些匹配項中獲得換行符,並且我確信這是我誤解的內容,或者,我得到的數據不是我所期望的。 (這是可能的..!)

我已經定義了一個正則表達式: new Regex(@"^\s*[0-9]{4}[A-Z]{2}[\s\*]\s*(?<token>.*?)\-(?<value>.*?)$", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);

我的文件/字符串我得到的是格式化像偶爾線:

0000AA Token1  - Value 
0000AA Token2  - Value 
0000AA Token3  - Value 
0000AA Another Tok- Value 

當我得到的所有像這樣的令牌,上面的正則表達式工作得很好。我得到四個匹配:

Match# <token> <value> 
1  Token1  Value 
2  Token2  Value 
3  Token3  Value 
4  Another Tok Value 

這很好。然而,有時用戶會送我一個文件,其中的標記有偶爾的缺失行,如:

0000AA Token1  - Value 
0000AA Token2  - Value 
0000AA Token3  - Value 
0000AA 
0000AA Another Tok- Value 

發生這種情況時,我正則表達式會給我以下值:

Match# <token>   <value> 
1  Token1    Value 
2  Token2    Value 
3  Token3    Value 
4  0000AA Another Tok Value 

我知道爲什麼,它匹配#4的標記從它上面的行開始。但是,當我將'token'分組更改爲(?<token>[^\n]*?)時,我仍然在'token'中獲得相同的值。

我覺得我失去了一些明顯的東西,因爲如果。當它不應該是匹配換行符的時候,更多的人會比葡萄乾更糟糕。我檢查了傳入的字符串 - 換行符是\n,而不是\r\n,但想知道是否還有其他問題。

再次歡呼 - Mike。

回答

4

問題出在\ s開頭的字母數字代碼之後; \ s也匹配換行符,而你不想。您基本上需要匹配\ s而不是\ n。這不是表達正則表達式,但如果你使用的德摩根定理,你可以重寫這個表達式:

\s AND NOT \n = NOT(NOT \s OR \n) 

原來,NOT \ S可以寫成\ S

\s AND NOT \n = NOT(NOT \s OR \n) = NOT(\S OR \n) 

這是容易地可表達爲正則表達式:

\s AND NOT \n = NOT(NOT \s OR \n) = NOT(\S OR \n) = [^\S\n] 

因此,代替\ s使用[^ \ S \ n],這意味着匹配除了換行符和\ s的否定。

我在同一區域做了一些其他更改,因爲我覺得有些東西沒有必要。如果您認爲它可以添加回來。

Regex re = new Regex(@"^[0-9]{4}[A-Z]{2}[^\S\n]*(?<token>.*?)\-(?<value>.*?)$", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture); 
+0

哇,謝謝。我覺得自己很笨 - 我從來沒有意識到換行符被認爲是空白。 (釷,它確實有道理!)也很好的提示了雙重否定 - 我從來沒有這樣想過。 謝謝! – Coyttl 2013-02-15 21:10:51

相關問題