2013-10-16 65 views
1

我有以下輸入:Regex.Split不能正常工作?

void Main() 
{ 
    string inputData = "37.7879\r\n-122.3874\r\n40.7805\r\n-111.9288\r\n36.0667\r\n-115.0927\r\n37.7879\r\n-122.3874"; 
    // string[] inputLines = Regex.Split(inputData, @"\r\n"); 
    string[] inputLines = Regex.Split(inputData, @"(\r)?\n"); 
    Console.WriteLine("The size of the list is: {0}", inputLines.Length); 
    bool results = inputLines.All(IsValidNumber); 

    foreach (string line in inputLines) 
    { 
     Console.WriteLine("{0} is: {1}", line, IsValidNumber(line)); 
    } 
} 

// Define other methods and classes here 
public bool IsValidNumber(string input) 
{ 
    Match match = Regex.Match(input, @"^-?\d+\.\d+$", RegexOptions.IgnoreCase); 
    return match.Success; 
} 

我想一個Regex.Split@"\r\n",如果我使用註釋行,然後我得到預期的結果。如果我使用未註釋的,我沒有得到我期望的結果。我幾乎100%肯定我的正則表達式是正確的如果"\r"不存在(可能會或可能不會)。

我期待inputData的8個值,​​我試圖驗證它們是否都是有效的數字。

有沒有可能我的"(\r)?"工作不正常?如果是這樣,我錯過了什麼?

+2

換句話說,括號被絆倒你。寫入它的正確方法是「@」(?:\ r)?\ n「',帶有非捕獲括號。或者,正如p.s.w.g所說,'\ r'是一個單獨的字符,所以你甚至不需要分組。 – Amadan

回答

3

如果你的模式包含一個捕獲組Regex.Split將捕獲該組,因爲它正在拆分內容。這會給你15個項目,而不是隻有8個。

如果你只是想讓單個字符或字符類可選,你不需要一個組。嘗試擺脫一羣人圍着\r

string[] inputLines = Regex.Split(inputData, @"\r?\n"); 

或者,是的,你可以把它非捕獲組:

string[] inputLines = Regex.Split(inputData, @"(?:\r)?\n"); 
+0

我意識到捕獲變量,我完全忘記了\ r是一個字符。我認爲這是兩個字符,我正在使用括號。 – coson

+0

@coson好的,我應該澄清。 「@」\ r「'實際上是兩個字符*作爲字符串*,但是,當它出現在正則表達式中時,它表示*一個匹配的單個字符。 –