簡體   English   中英

Regex.Split如何給我重疊的匹配項?

[英]How is Regex.Split giving me overlapping matches?

我有一個大的正則表達式,用於解析類似於lua的自己的文件格式。 這行之有效,除了引號內的數字以某種方式匹配兩次,即使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

從文檔中

如果在Regex.Split表達式中使用了捕獲括號,則任何捕獲的文本都將包含在結果字符串數組中。 例如,在捕獲圓括號內的連字符上拆分字符串“ plum-pear”會將包含連字符的字符串元素添加到返回的數組中。

您有兩組捕獲的括號,一組包括引號,另一組除外。 這些返回您看到的字符串。

請注意, RegEx.Split的模式RegEx.Split匹配所需的結果,而應與定界符匹配。 帶引號的字符串通常不是定界符。

另外,您的結果似乎很奇怪,因為您使用了貪婪的比賽。 顯然要求“輸入字符串被盡可能多地分割”。 使整個操作的匹配不貪心。

總體而言,我會說您使用的是錯誤的工具。 根據實現的不同,正則表達式無法處理嵌套分組或效率極低。 簡單的DFA應該可以更好地工作,並且永遠不需要一次掃描。

只需刪除外括號,

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

//Tested output:
01
02
03

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM