正则表达式在csv引用的elems中找到逗号

时间:2013-06-12 22:50:09

标签: java regex

我正在尝试用CSV中双引号元素中的占位符文本替换逗号。

例如,给出CSV中的这一行:
     1,2,"three,four,five",6,7,8,"nine,ten",11,12

使用此正则表达式(引用转义为Java):
     (?<=\")([^"]+?),([^"]+?)(?=\")

我将第一场比赛换成:

$1<COMMA>$2

这给了我这个结果字符串:

1,2,"three<COMMA> four, five",6,7,8,"nine,ten",11,12 

我对resultString重复这些步骤,直到没有更多匹配为止。以下是渐进式结果字符串:

1,2,"three<COMMA> four, five",6,7,8,"nine,ten",11,12
1,2,"three<COMMA> four<COMMA> five",6,7,8,"nine,ten",11,12
1,2,"three<COMMA> four<COMMA> five",6<COMMA>7,8,"nine,ten",11,12
1,2,"three<COMMA> four<COMMA> five",6<COMMA>7<COMMA>8,"nine,ten",11,12
1,2,"three<COMMA> four<COMMA> five",6<COMMA>7<COMMA>8,"nine<COMMA>ten",11,12
1,2,"three<COMMA> four<COMMA> five",6<COMMA>7<COMMA>8,"nine<COMMA>ten",11,12 

我如何调整我的正则表达式,以便它只替换列表项中的“,”而不是分隔符本身?在第3次迭代中,我得到一个匹配:“,6,7,8,”

我试图通过让我的lookbehind匹配仅针对一个没有dble引号的dbl引用或三个dbl引号的组来阻止这种情况,但遇到了“Look-behind组没有明显的最大长度”错误,

2 个答案:

答案 0 :(得分:1)

您可以更改它,以便引号内的第一个匹配字符不能是逗号:(?<=\")([^",][^"]*?),([^"]+?)(?=\")

话虽如此,我不认为迭代它直到它停止迭代这样做是一种非常好的方式。我个人可能会使用未转义的列将行拆分为一个字符串数组,然后遍历数组并使用/ g修饰符对数组中每个"分隔的字符串进行搜索和替换。但我认为这是个人选择。

答案 1 :(得分:0)

快速谷歌之后:

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

这匹配csv文件中的单个元素。

http://www.kimgentes.com/worshiptech-web-tools-page/2008/10/14/regex-pattern-for-parsing-csv-files-with-embedded-commas-dou.html