[英]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.