正则表达式匹配CSV文件嵌套引号

时间:2010-06-09 02:04:44

标签: java regex csv

我知道这已被讨论了一百万次。我尝试在论坛中搜索并看到一些接近的正则表达式并尝试修改它们但无济于事。

假设CSV文件中有一行如下:

"123", 456, "701 "B" Street", 910
                 ^^^

是否有一个简单的正则表达式来检测"B"(因为它是普通CSV引号中的一组非转义引号)并将其替换为\"B\"之类的内容?最终的字符串最终看起来像这样:

"123", 456, "701 \"B\" Street", 910

非常感谢帮助!

5 个答案:

答案 0 :(得分:4)

相信我你不想用正则表达式做这件事。你需要像Java CSV Library这样的东西。

答案 1 :(得分:1)

有几个图书馆可以帮助您解析CSV,但如果您出于学术原因想要使用正则表达式,这可能有所帮助:

  • 引用带有转义支持的字符串。 “(\\ |。[^ \\”])*“
  • 未加引号的字段:[^“,] * * / / li>
  • 分隔符:,*

我不使用CSV文件,所以我不确定'其他csv字段'的有效性(匹配456,例如上面的),或者/,* /是你想要的分隔符。

无论如何,组合上述内容将匹配一个字段和一个分隔符(或字符串的结尾):

(quotedstring|unquoted)(delimiter|$)

答案 2 :(得分:1)

(?<!^)(?<!",)(?<!\d,)"(?!,")(?!,\d)(?!$)(?!,-\d)

我让这个工作,如果其他人正在寻找答案,我想发布它

答案 3 :(得分:0)

我会使用量身定制的sed表达式

's/\(.*\),\(.*\),\(.*\)"\(.*\)\" \(.*\),\(.*\)/\1,\2,\3 \4 \5 \6/g'

答案 4 :(得分:0)

您的示例不正确CSV:

"123", 456, "701 "B" Street", 910

这应该是:

"123", 456, "701 ""B"" Street", 910

(当然,CSV有很多变种,但是由于大多数时候人们都希望它与excel或访问一起使用,所以我坚持使用微软的定义。)

因此,正则表达式可能如下所示:

".+("").+("").+"

组(在括号中)将是您的双引号,其余组确保它们在另一组引号中找到。

这涵盖了您需求的查找部分。替换部分取决于您编程的内容。