在Notepad ++中,我使用Regex替换CSV文件中引号之间的逗号。
使用here中的类似示例。这就是我想要阅读的内容。
1070,17,2,GN3-670,"COLLAR B, M STAY,","2,606.45"
除了在我的文字中,在结束引号之前还有一个额外的逗号。
正则表达式("[^",]+),([^"]+")
似乎没有拿到最后一个逗号,结果是
1070,17,2,GN3-670,"COLLAR B M STAY,","2606.45"
我想
1070,17,2,GN3-670,"COLLAR B M STAY","2606.45"
是否有简单的正则表达式,还是我必须使用csv reader C#?
编辑:一些正则表达式给出了错误的匹配,所以我想添加另一个场景。如果我有
1070,17,2,GN3-670,"COLLAR B, M STAY,",55, FREE,"2,606.45"
我想
1070,17,2,GN3-670,"COLLAR B M STAY",55, FREE,"2606.45"
答案 0 :(得分:0)
答案 1 :(得分:0)
这应该有效
查找内容("[^"]*),"
替换为\1"
答案 2 :(得分:0)
我认为这是您正在寻找的:
,(?=[^"]*"(?:[^"]*"[^"]*")*[^"]*$)
这匹配任何逗号,后跟奇数引号。它只消耗逗号,所以你不用任何东西替换它。
关于原始解决方案的事情是它只匹配每个引用字段的一个逗号。它甚至从未尝试来匹配"COLLAR B, M STAY,"
中的第二个逗号,所以它的位置并不重要。此解决方案删除任意数量的逗号,无论它们在字段中的位置如何。
更新:此正则表达式假设您一次只处理一行。如果您在包含许多行的整个文档中使用它,则正则表达式可能会超时。您可以通过排除行终止符(回车符和换行符)来解决这个问题,如下所示:
,(?=[^"\r\n]*"(?:[^"\r\n]*"[^"\r\n]*")*[^"\r\n]*$)
请注意,CSV规范(例如它)表示您可以在引用字段中包含行终止符,因此此正则表达式在技术上是不正确的。如果确实需要支持多行字段,也可以切换到CSV库。正则表达式不能完全处理CSV,但在大多数情况下,它们已经足够好了。