我有一个很大的正则表达式,用于解析我自己的文件格式,类似于lua。这工作正常,除非引号内的数字匹配两次,即使拆分不应返回重叠结果。我把它简化为这个控制台应用程序。有什么想法吗?
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
答案 0 :(得分:2)
如果在
Regex.Split
表达式中使用捕获括号,则任何捕获的文本都包含在结果字符串数组中。例如,在捕获括号内的连字符上拆分字符串“plum-pear”会在返回的数组中添加一个包含连字符的字符串元素。
您有两组捕获括号,一组包含引号,另一组包含引号。这些返回你看到的字符串。
请注意,RegEx.Split
的模式不应与期望的结果匹配,它应该与分隔符匹配。带引号的字符串通常不是分隔符。
另外,你的结果看起来很奇怪,因为你使用过贪婪的比赛。显然,要求“输入字符串被尽可能多地拆分。”使整个操作匹配非贪婪。
总的来说,我会说你使用的是错误的工具。正则表达式取决于实现,不能处理嵌套分组或极低效。简单的DFA应该可以更好地工作,而且不需要多次扫描。
答案 1 :(得分:1)
只需删除外括号
string pattern = "(\r\n)|\"(.*)\"";
//Tested output:
01
02
03