正则表达式从 CSV 中删除未转义的引号

Regex to remove unescaped quotes from a CSV

提问人:Tom 提问时间:3/20/2020 最后编辑:Tom 更新时间:3/22/2020 访问量:437

问:

我需要将 CSV 文件馈送到数据库中。为此,我必须删除“野生”未转义的引号。

可以采用以下输入结构:

"aa";"bb";"cc";"dd";"ee"
"aa";"bb";"c "cc" c";"dd";"ee"
"aa";;"cc";"dd";"ee"
"aa";55;"cc";"dd";"ee" 

表达式:

(?<!^|\"\;)\"(?!\;|$)

适用于输入示例的 #1 和 #2,但当存在空元素 (#3) 或未加引号的数字字段 (#1) 时失败。另请参阅此 Rubular 示例

任何如何涵盖这些案件的指示将不胜感激。

编辑:

按照 @Wiktor Stribiżew 的建议,我现在正在使用

(^"|"$|";+"|";\d+;"|";|;")|"

这也涵盖了我在输入数据中确定的一些其他边缘情况,如下所示

正则表达式 CSV 转义 报价

评论

0赞 Eraklon 3/20/2020
好吧,我猜这将匹配未转义的 qoutes,但不确定您的预期输出是什么。(?<!\\)"
0赞 Tom 3/20/2020
我需要在列的开头和结尾保留“文本限定符”引号,但删除列其余部分的引号
1赞 Wiktor Stribiżew 3/20/2020
根据您的要求,您可以使用正则表达式替换方法搜索并替换为 / 。查看 regex101.com/r/suDXQz/1(^"|"$|";+"|";\d+;")|"$1\1
0赞 nhahtdh 3/20/2020
与其乱搞 CSV,我建议修复输出此文件的任何程序,您可以在其中修改引用行为以使其不那么激进。此外,第 2 行很可能在第 3 列中包含引号字符,并且在此处没有正确转义。
0赞 Tom 3/21/2020
@WiktorStribiżew 非常感谢,效果很好。如果你把它作为答案发布,我可以接受

答:

1赞 Wiktor Stribiżew 3/22/2020 #1

以下解决方案仅满足您当前的要求,不是在 CSV 中修复报价的通用解决方案:

(^"|"$|";+"|";\d+;")|"

替换为 (或 ,具体取决于使用此正则表达式的位置)。$1\1

请参阅正则表达式演示

  • (^"|"$|";+"|";\d+;")- 第 1 组:
    • ^"| - "在字符串的开头,或者
    • "$| - "在字符串的末尾,或者
    • ";+"| - "、1+ 个字符,然后 ,或者;"
    • ";\d+;" - ";,则 1+ 位数字;"
  • |-或
  • "- 一个字符。"