0

我有一个大型正则表达式,用于解析我自己的类似于 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
4

2 回答 2

2

从文档中

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

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

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

此外,您的结果似乎很奇怪,因为您使用了贪婪匹配。显然要求“输入字符串被分割尽可能多的次数”。使整个操作的匹配非贪婪。

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

于 2010-12-18T04:33:07.587 回答
1

只需删除外括号,

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

//Tested output:
01
02
03
于 2010-12-18T04:37:23.717 回答