2010-12-18 46 views
0

我有一個很大的正則表達式,我用它來解析我自己的類似於lua的文件格式。這工作正常,除了不管怎樣,引號內的數字得到匹配兩次,即使拆分不應該返回重疊的結果。我簡化了它到這個控制檯應用程序。有任何想法嗎?Regex.Split如何給我重疊匹配?

static void Main(string[] args) 
{ 
    string pattern = "(\r\n)|(\"(.*)\")"; // Splits at \r\n and anything in "quotes" 

    string input = "\"01\"\r\n" + // "01" 
        "\"02\"\r\n" + // "02" 
        "\"03\"\r\n"; // "03" 

    string[] results = Regex.Split(input, pattern); 
    foreach (string result in results) 
    { 
      //This just filters out the split \r\n and empty strings in results 
      if (string.IsNullOrWhiteSpace(result) == false) 
       Console.WriteLine(result); 
    } 
    Console.ReadLine(); 
} 

返回:

"01" 
01 
"02" 
02 
"03" 
03 

回答

2

From the documentation

如果捕獲括號在一個Regex.Split表達所使用的,任何捕獲文本被包括在生成的字符串數組英寸例如,將字符串「plum-pear」拆分到捕獲圓括號內的連字符上會添加一個字符串元素,該字符串元素包含連字符到返回的數組。

你有兩套捕獲括號,一個包容性的報價和一個排他的。這些返回你看到的字符串。

請注意,RegEx.Split的模式不應該匹配所需的結果,它應該與分隔符相匹配。帶引號的字符串通常不是分隔符。

此外,你的結果看起來很奇怪,因爲你使用了一個貪婪的匹配。顯然要求「輸入字符串儘可能多次分割」。使整個操作的匹配非貪心。總之,我會說你使用了錯誤的工具。正則表達式取決於實現,不能處理嵌套分組或效率極低。簡單的DFA應該效果更好,永遠不需要多次掃描。

+0

我不知道Regex.Split應該匹配定界符,但即使如此,爲什麼括號影響比賽?他們不是隻用於分組嗎? – Miguel 2010-12-18 04:41:03

+0

@Miguel:我建議你閱讀文檔。我提供了一個鏈接,但時間並不長。 – 2010-12-18 04:44:04

+0

本的權利,這不是'Split'的工作。 – 2010-12-18 04:58:09

1

只是刪除外括號,

string pattern = "(\r\n)|\"(.*)\""; 

//Tested output: 
01 
02 
03 
+0

這也可以,但沒有解釋。無論如何 – Miguel 2010-12-18 04:52:09