java正则表达式删除csv中不需要的双引号

java正则表达式删除csv中不需要的双引号,java,regex,string,csv,Java,Regex,String,Csv,我有一个csv文件,它有以下行。正如您所看到的,数字没有用双引号括起来 String theLine = "Corp:Industrial","5Nearest",51.93000000,"10:21:29","","","","10:21:29","7/5/2016","PER PHONE CALL WITH SAP, CORRECTING "C","359/317 97 SMRD 96.961 MADV","" 我尝试阅读上面的行,并使用正则表达式进行拆分 String[] tokens

我有一个csv文件,它有以下行。正如您所看到的,数字没有用双引号括起来

String theLine = "Corp:Industrial","5Nearest",51.93000000,"10:21:29","","","","10:21:29","7/5/2016","PER PHONE CALL WITH SAP, CORRECTING "C","359/317 97 SMRD 96.961 MADV",""
我尝试阅读上面的行,并使用正则表达式进行拆分

String[] tokens = theLine.split(",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))");
这不是我想要的每个逗号都分开。 SAP的每一个电话,更正“C”,都会把事情搞砸,因为它有额外的(逗号)和(双引号)。有人能帮我写一个正则表达式,它将转义一个额外的双引号和两个双引号中的逗号

我基本上想要:

"Corp:Industrial","5Nearest",51.93000000,"10:21:29","","","","10:21:29","7/5/2016","**PER PHONE CALL WITH SAP CORRECTING C**","359/317 97 SMRD 96.961 MADV",""

解析器比正则表达式更擅长于某些工作,而这类工作通常就是其中之一。我不是说你不能让它为你工作,但是。。。还有一些开源的CSV解析器,您可以将其投入使用

话虽如此,我还是怀疑你的CSV

"PER PHONE CALL WITH SAP, CORRECTING "C",
该值中有三个引号——是否表示只包含一个引号的字符串?或者C应该被引号和字符串包围吗

通常,如果要在双引号中包含双引号,则需要特殊语法。对于CSV,最常见的选项是将其加倍,或使用反斜杠之类的字符对其进行转义:

"PER PHONE CALL WITH SAP, CORRECTING ""C""",
或:


所有这些都不会直接改变您使用正则表达式的问题,但一旦您拥有格式良好的CSV,您成功解析它的几率就会提高。

使用选项并将代码示例包装在
代码块中(
{}
编辑器菜单中的图标)。这样将打印所有字符,如
*
\
。您可以修改生成CSV行的源代码吗?它不能正常工作,因为你有不平衡的/未替换的引号。如果你确信这些孤立引号永远不会接近逗号,那么很容易解决这个问题,否则了解每个字段的外观可能会有所帮助。使用CSV解析器,而不是用一个不好的正则表达式重新设计轮子。Geoffrey,我已经试过ApacheCsvParser,当它读到这一行时,它就崩溃了。就像你说的,这不是一个格式良好的CSV。每隔一段时间,我们都会用Geoffrey创建这种格式的文件,我已经试过ApacheCsvparser,当它读到这一行时,它就崩溃了。就像你说的,这不是一个格式良好的CSV。我们不时会有文件以这种格式创建。我的工作是解析这些文件。当我执行line.split(“,(?=(?:[^\“]*\”[^\“]*\”*(?![^\“]*\”)时,”);我只得到4个代币,而不是每次都得到一个代币“,我认为不可能有一个真正可靠的解决方案来处理格式错误的CSV。您可能能够将一些处理更明显案例的内容拼凑在一起,这可能就足够了。但如果你可能会得到不匹配的未替换报价。。。我仍然觉得你应该推迟得到一个格式良好的文件。如果你真的做不到。。。。我想我可能会转而编写一个自定义解析器,而不是尝试处理正则表达式,但如果您不能确定字符串何时结束,那么即使这样也会非常困难。谢谢Geoffrey的回复,我最终编写了一个自定义解析器。
"PER PHONE CALL WITH SAP, CORRECTING \"C\"",