正则表达式在结束引用Notepad ++之前用逗号删除引号之间的逗号

时间:2015-09-22 16:11:34

标签: regex notepad++

在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"

3 个答案:

答案 0 :(得分:0)

您可以使用以下内容进行匹配:

((["])(?:(?=(\\?))\3.)*?),\2

并替换为以下内容:

\1"

请参阅DEMO

答案 1 :(得分:0)

这应该有效

查找内容("[^"]*),"

替换为\1"

答案 2 :(得分:0)

我认为这是您正在寻找的:

,(?=[^"]*"(?:[^"]*"[^"]*")*[^"]*$)

这匹配任何逗号,后跟奇数引号。它只消耗逗号,所以你不用任何东西替换它。

关于原始解决方案的事情是它只匹配每个引用字段的一个逗号。它甚至从未尝试来匹配"COLLAR B, M STAY,"中的第二个逗号,所以它的位置并不重要。此解决方案删除任意数量的逗号,无论它们在字段中的位置如何。

更新:此正则表达式假设您一次只处理一行。如果您在包含许多行的整个文档中使用它,则正则表达式可能会超时。您可以通过排除行终止符(回车符和换行符)来解决这个问题,如下所示:

,(?=[^"\r\n]*"(?:[^"\r\n]*"[^"\r\n]*")*[^"\r\n]*$)

请注意,CSV规范(例如它)表示您可以在引用字段中包含行终止符,因此此正则表达式在技术上是不正确的。如果确实需要支持多行字段,也可以切换到CSV库。正则表达式不能完全处理CSV,但在大多数情况下,它们已经足够好了。