从包含双引号和周围双引号的字符串中删除逗号

时间:2016-06-01 18:55:34

标签: regex regex-group

输入字符串

Arab World,ARB,"Adolescent fertility rate (births per 1000 women ages 15-19)",SP.ADO.TFRT,1960,133.56090740552298

输出字符串

Arab World,ARB,Adolescent fertility rate (births per 1000 women ages 15-19),SP.ADO.TFRT,1960,133.56090740552298

输入字符串

Arab World,ARB,"International migrant stock, total",SM.POP.TOTL,1960,3324685.0

输出字符串

Arab World,ARB,International migrant stock total,SM.POP.TOTL,1960,3324685.0

2 个答案:

答案 0 :(得分:0)

最好在这里使用两部分流程。

步骤1拆分字符串

这个正则表达式会在逗号上拆分你的字符串。嵌套在引号内的任何逗号都将被忽略。此外,周围的引号将在同一操作中被删除。

正则表达式:

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

Regular expression visualization

现场演示

https://regex101.com/r/rJ5oF9/1

简单地在分隔逗号

上拆分字符串

步骤2替换逗号

遍历字符串数组并替换每个

中的逗号

正则表达式:,

替换为:没有

现场演示

https://regex101.com/r/pA1iA6/1

答案 1 :(得分:0)

使用两个正则表达式可以解决这个问题(我将在这里用perl单行程表示它们)。首先,使用以下命令删除引号之间的第一个逗号(请注意,同一组引号中的后续逗号不会被删除):

s/"((?!").)*?\K,(((?!").)*")/$2/g

下一个正则表达式删除了引号对:

s/"(((?!").)*)"/$1/g

可以实现这些正则表达式的一些代码可以如下:

perl -plane 's/"((?!").)*?\K,(((?!").)*")/$2/g; s/"(((?!").)*)"/$1/g' originalFile.csv > newFile.csv