2010-12-18 65 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