【问题标题】:Regex to remove unescaped quotes from a CSV正则表达式从 CSV 中删除未转义的引号
【发布时间】:2020-03-19 19:29:12
【问题描述】:

我需要将 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) 或未加引号的数字字段 (#4) 时会失败。另见this Rubular example

任何关于如何涵盖这些案例的指针将不胜感激。

编辑:

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

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

这也涵盖了一些额外的边缘情况,我在输入数据中已经确定,如图here

【问题讨论】:

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

标签: regex csv escaping quotes


【解决方案1】:

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

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

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

请参阅regex demo

详情

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

【讨论】:

    猜你喜欢
    • 2013-08-27
    • 2020-02-19
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多