C# Regex.Split如何给我重叠匹配?

C# Regex.Split如何给我重叠匹配?,c#,regex,parsing,split,overlap,C#,Regex,Parsing,Split,Overlap,我有一个大型正则表达式,用于解析我自己的文件格式,类似于lua。这很好,除了引号中的数字会匹配两次,即使split不应该返回重叠的结果。我已经将其简化为这个控制台应用程序。有什么想法吗 static void Main(string[] args) { string pattern = "(\r\n)|(\"(.*)\")"; // Splits at \r\n and anything in "quotes" string input = "\"01\"\r\n" + //

我有一个大型正则表达式,用于解析我自己的文件格式,类似于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”会将包含连字符的string元素添加到返回的数组中

您有两组捕获括号,一组包含引号,另一组为独占括号。这些将返回您看到的字符串

请注意,
RegEx.Split
的模式不应该匹配所需的结果,而是应该匹配分隔符。带引号的字符串通常不是分隔符

而且,您的结果看起来很奇怪,因为您使用了贪婪匹配。显然,“输入字符串被尽可能多地分割”的要求使得匹配对于整个操作来说是非贪婪的

总的来说,我认为你使用了错误的工具。根据实现的不同,正则表达式无法处理嵌套分组或效率极低。一个简单的DFA应该工作得更好,而且永远不需要超过一次扫描。

:

如果在
Regex.Split
表达式中使用捕获括号,则所有捕获的文本都将包含在结果字符串数组中。例如,在捕获括号内的连字符上拆分字符串“plum pear”会将包含连字符的string元素添加到返回的数组中

您有两组捕获括号,一组包含引号,另一组为独占括号。这些将返回您看到的字符串

请注意,
RegEx.Split
的模式不应该匹配所需的结果,而是应该匹配分隔符。带引号的字符串通常不是分隔符

而且,您的结果看起来很奇怪,因为您使用了贪婪匹配。显然,“输入字符串被尽可能多地分割”的要求使得匹配对于整个操作来说是非贪婪的


总的来说,我认为你使用了错误的工具。根据实现的不同,正则表达式无法处理嵌套分组或效率极低。一个简单的DFA应该工作得更好,而且永远不需要超过一次扫描。

只要去掉外括号

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

//Tested output:
01
02
03

去掉外圆括号

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

//Tested output:
01
02
03

我不知道Regex.Split应该与delimeters匹配,但即使如此,为什么括号会影响匹配?它们不只是用来分组吗?@Miguel:我建议你看看文档。我提供了一个链接,它没有那么长。解析类似这样的东西的一个更好的选择是基于Linq的组合器:我不知道正则表达式。Split应该匹配delimeters,但即使如此,为什么括号会影响匹配?它们不只是用来分组吗?@Miguel:我建议你看看文档。我提供了一个链接,它没有那么长。解析类似这样的东西的一个更好的选择是基于Linq的组合器: