假设输入与您的示例一样简单(即不是完整的 CSV 数据),则应该这样做:
string input = @"a,b,c,""d,d,d"",e,f,""g,g"",h";
Console.WriteLine(input);
string result = Regex.Replace(input,
@",(?=[^""]*""(?:[^""]*""[^""]*"")*[^""]*$)",
String.Empty);
Console.WriteLine(result);
output:
a,b,c,"d,d,d",e,f,"g,g",h
a,b,c,"ddd",e,f,"gg",h
正则表达式匹配任何后跟奇数个引号的逗号。
编辑:如果字段用撇号引用('
) 而不是引号 ("
),技术是完全相同的——只不过你不必转义引号:
string input = @"a,b,c,'d,d,d',e,f,'g,g',h";
Console.WriteLine(input);
string result = Regex.Replace(input,
@",(?=[^']*'(?:[^']*'[^']*')*[^']*$)",
String.Empty);
Console.WriteLine(result);
如果某些字段用撇号引用,而其他字段用引号引用,则需要采用不同的方法。
编辑:可能应该在之前的编辑中提到这一点,但是您可以将这两个正则表达式组合成一个可以处理的正则表达式either撇号or引号(但不能同时使用):
@",(?=[^']*'(?:[^']*'[^']*')*[^']*$|[^""]*""(?:[^""]*""[^""]*"")*[^""]*$)"
其实,它will处理简单的字符串,例如'a,a',"b,b"
。问题是没有什么可以阻止您在另一种类型的带引号字段中使用引号字符,例如'9" Nails'
(原文如此)或"Kelly's Heroes"
。这将我们带入成熟的 CSV 领域(如果不是超越的话),而且我们已经确定我们不会进入那里。 :D