如何删除(逗号)在"(双引号逗号)和"(双引号逗号)之间.就像有"a","b","c","d,d","e","f",然后从这里,在"和"之间有一个逗号应该被删除,删除该逗号后它应该 "a","b","c","dd","e","f"在C#的正则表达式的帮助下?
编辑:我忘了指定引号之间可能有双逗号"a","b","c","d,d,d","e","f",因为正则表达式不起作用.并且引号之间可以有任意数量的逗号.
并且可以有像那样的字符串a,b,c,"d,d",e,f应该有结果a,b,c,dd,e,f,如果字符串像a,b,c,"d,d,d",e,f那样的结果应该是a,b,c,ddd,e,f.
Ala*_*ore 10
假设输入就像您的示例一样简单(即,不是完整的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);
Run Code Online (Sandbox Code Playgroud)
输出:
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);
Run Code Online (Sandbox Code Playgroud)
如果某些字段用撇号引用而其他字段用引号引用,则需要采用不同的方法.
编辑:大概应该在前面的编辑提到这一点,但你可以这两个正则表达式组合成一个正则表达式将处理要么撇号或引号(但不是全部):
@",(?=[^']*'(?:[^']*'[^']*')*[^']*$|[^""]*""(?:[^""]*""[^""]*"")*[^""]*$)"
Run Code Online (Sandbox Code Playgroud)
实际上,它会处理简单的字符串'a,a',"b,b".问题是没有什么可以阻止你在另一种类型的引用字段中使用其中一个引号字符,如'9" Nails'(sic)或"Kelly's Heroes".这将我们带入成熟的CSV领域(如果不是超越),我们已经确定我们不会去那里.:d
它们被称为正则表达式是有原因的 - 它们用于处理符合非常具体和学术定义的字符串,用于"常规".看起来你在这里有一些相当典型的csv数据,而且csv字符串超出了那个特定的定义:csv数据不是正式的"常规".
尽管如此,可以使用正则表达式来处理csv数据.但是,要做到这一点,您必须使用普通正则表达式的某些扩展来使它们完全成熟,知道某些特定csv数据的约束,这些约束在一般情况下是未承诺的,或者两者兼而有之.无论哪种方式,执行此操作所需的表达式都非常难以管理.即使有可能,这通常也不是一个好主意.
更好(通常更快)的解决方案是使用专用的CSV解析器.在代码项目(FastCSV和Linq-to-CSV)中托管了两个好的,在.Net Framework(Microsoft.VisualBasic.TextFieldParser)中内置了一个(实际上有几个),我在Stack Overflow上有一个.与基于正则表达式的解决方案相比,这些中的任何一个都会表现得更好,而且效果更好
请注意,我并不认为它无法完成.今天大多数正则表达式引擎都有必要的扩展来实现这一点,并且大多数解析csv数据的人都对他们正在处理的数据有足够的了解以适当地约束它.我认为执行起来较慢,难以实现,难以维护,并且与专用解析器替代方案相比更容易出错,这可能构建在您正在使用的任何平台上,因此不符合您的最佳利益.