0

我正在尝试用 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 

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

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

4

2 回答 2

1

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

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

于 2013-06-12T23:07:45.037 回答
0

快速谷歌后:

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

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

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

于 2013-06-12T22:54:51.970 回答