【问题标题】:How to Escape the unescaped double quotes in a CSV string in Node如何在 Node 的 CSV 字符串中转义未转义的双引号
【发布时间】:2021-07-30 18:08:01
【问题描述】:

这很像

Regular expression to find unescaped double quotes in CSV file

但是,提供的解决方案不适用于 Node.js 的正则表达式引擎。给定一个 CSV 字符串,其中列用双引号引起来,但某些列中包含未转义的双引号,可以使用什么正则表达式来匹配这些未转义的引号并删除它们。

示例行

 "123","","SDFDS   SDFSDF EEE "S"","asdfas","b","lll"
 "123","","SDFDS   SDFSDF EEE "S"","asdfas","b","lll"

因此,第三列中 S 周围的两个双引号将被匹配并删除。需要在 Node.js (14.16.1) 中工作

我尝试了(?m)""(?![ \t]*(,|$)),但得到了Invalid regular expression: /(?m)""(?![ \t]*(,|$))/: Invalid group 异常

【问题讨论】:

  • 什么解决方案在 JavaScript 中不起作用? There are 那里有不少。
  • 请向我们展示您尝试过的代码。它的相关部分。谢谢。
  • 正如我最初指出的那样,那里的解决方案在 Node.js 中不起作用。我已经更新了我的问题,但有例外。

标签: javascript node.js regex csv


【解决方案1】:

我对 node.js 了解不多,但假设它类似于 regex 的 JavaScript 风格,那么我有以下关于您从先前答案中获取的示例的 cmets:

  1. 我认为您的示例在第一个元素 (?m) 上令人窒息,这在 Javascript 中不受支持。但是,该部分对您的任务来说不是必不可少的。它只打开多行处理,如果您单独为正则表达式引擎提供每行,则不需要它。如果你发现你仍然想给它一个多行字符串,那么你仍然可以在 JavaScript 中打开多行 - 你可以在最后的分隔符“/myregex/m”之后使用“m”标志来做到这一点。 JavaScript 支持所有其他元素,包括负前瞻,您的引擎也可能支持。因此,请删除表达式的 (?m) 部分,然后再试一次。
  2. 即使在你让它工作之后,你提供的示例行也不会按照你的期望被示例正则表达式解析。它的功能是识别所有出现的两个双引号后面没有逗号(或字符串结尾)的情况。在您的示例中,只有两次出现的双引号后面都有一个逗号,因此在您的示例中,您将不会在此正则表达式上得到任何匹配项。
  3. 您似乎想要一些上下文相关的扫描来匹配和删除内部双引号对,同时保留外部双引号并处理字符串中的逗号以及可能正确引用的双引号。正则表达式引擎在这种处理方面真的很糟糕,我认为无论你想出什么,你都不会得到令人满意的结果。
  4. 您可以通过使用正则表达式一次来解析 .csv 的各个元素并在执行过程中剥离外引号,然后针对每个解析的元素运行第二个正则表达式以删除单次出现的双引号,从而获得问题的近似解决方案或在必要时添加第二个双引号。然后你可以在程序控制下重新组合字符串。
    如果有人在数据字段字符串中嵌入“”序列,这仍然会中断,所以它并不完美,但对你来说可能已经足够了。

用于拆分 .csv 并去除双引号的正则表达式是:

/(("(.*?)")|([^,]*))(,|$)/gm

这将反复接受“anything”或anything,直到源耗尽。由于捕获组,解析的文本将在 $3 (如果该字段被引用)或 $4 (如果它没有被引用),但不是两者兼而有之。 这是每次迭代后用 $3&$4 和分号替换您的字符串的 regexpReplace(我冒昧地添加了一个不带引号的数字字段,因此您可以看到它可以处理这两种情况):

"123","","SDFDS   SDFSDF EEE "S"",456,"asdfas","b","lll"

RegexpReplace(<above>,"((""(.*?)"")|([^,]*))(,|$)","$3$4;")
=>  123;;SDFDS   SDFSDF EEE "S";456;asdfas;b;lll;;

看看外部引号是如何被去掉的。现在,通过所有匹配项删除所有剩余引号是一件简单的事情,然后您可以从匹配项数组中重构字符串。

【讨论】:

    猜你喜欢
    • 2010-11-24
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多