【问题标题】:Regex to find and replace single quotation marks in strings separated by a comma and enclosed in quotes正则表达式查找和替换用逗号分隔并用引号括起来的字符串中的单引号
【发布时间】:2016-03-03 13:28:14
【问题描述】:

我正在使用 Sublime Text 3,并且我有一个包含单引号的 CSV 文件:

输入:

"col1", "col2", "col3", "col4", "col5"
"Cakes", "5" Carrots", "Pineapples'", ""Eggs"", "Apple 5" and 10""
...

使用正则表达式我想“中和”但不删除不合适的单引号(例如5" Carrots""Eggs"")和撇号(例如Pineapples')。

通过中和我的具体意思是在每个单引号/撇号前面放置\",因此输出是:

输出:

"col1", "col2", "col3", "col4", "col5"
"Cakes", "5\"" Carrots", "Pineapples\"'", "\""Eggs\""", "Apple 5\"" and 10\"""
...

目前的进展: 我想我需要 2 件来解决这个难题。

首先,我可以使用正则表达式 (".*)(["])(.*") 自行查找和替换每个字段的引号 示例:

输入: "Hello 5" World" 查找: (".*)(["])(.*") 替换: \1\\\""\3 输出: "Hello 5\"" World"。要重现这一点,您需要在崇高的查找和替换工具栏上选择正则表达式和换行选项。

其次,我可以使用正则表达式 ([^,\n]+) 在 csv 文件(在 Sublime 中打开)中找到每个字段。有关详细信息,请参阅 this 上一个问题。

问题是我如何使用这两种技术(或其他技术,如果需要)来获取一个正则表达式来查找和一个正则表达式来替换每个具有单引号的字段(即在它前面加上\")。

如果您认为这不能通过 sublime 和正则表达式来完成,那么如果您能提出一种方法来做到这一点,那就太好了。

更多详情: 为了绝对清楚,一个解决方案应该包含一个正则表达式,它可以找到 CSV 文件(在 sublime 中打开)中包含一个单引号的每个字段。然后应该有一个正则表达式,在每个引号之前插入字符串 \"

【问题讨论】:

  • 我认为如果这个"5" Carrots" 是一个有效字段,那么引号内不能有逗号对吗?否则可能是 ",5," Carrots", 使逗号成为唯一有效的分隔符。
  • @sln 有一个很好的观点。 ",5","Something" 是否有效?注意第一组中的命令,在 5 之前。
  • @Erutan409 是的,",5","Something" 将是一个有效字段。但是逗号不需要被“处理”(有\")放在它前面。

标签: regex perl csv replace sublimetext3


【解决方案1】:

我将执行三个步骤来解决您的问题:

  1. 执行此查找/替换regex 为文本组创建障碍

      "([\S\h]*?)"((?:,|\h*$)) 替换为 [<]$1[>]$2

  1. 然后使用此查找/替换regex 查找有问题的双引号

      "|(?=') 替换为 \\"

  1. 然后,最后,用regex 将您的障碍物替换回原来的位置

      \[[<>]\] 替换为 "

编辑:

我刚刚更新了第 2 步。我想我正确理解了您的问题。如果不是,请解释原因,我会相应地调整正则表达式。

【讨论】:

  • 太棒了——非常感谢!唯一的调整是,在第 2 步中,\\"\" 的替换正则表达式似乎可以工作。
  • 我现在唯一意识到自己愚蠢的是,当它是撇号时,需要进行调整以放置 \'' - 有没有办法调整它以在打开时实现这一点撇号但保持原样作为引号?如果这是一个巨大的变化,请不要担心代码可能会针对每种情况运行两次。再次感谢您的帮助。
  • 需要一个额外的步骤;很可能在第 3 步之前。所以,我会修改第 2 步,只替换第一部分 " -> \\"\" (正如您在第一条评论中指出的那样)。然后再添加一个步骤,找到单引号(?<!\\)' -> \''。上述 rexeg 中的后视是我的一个假设。如果您在匹配单引号时不关心潜在的前置反斜杠,请删除它。
  • 嗯,好的。现在才测试。对于新步骤,添加一个额外的反斜杠似乎可以使其工作((?<!\\)' -> \\'')。再次感谢您的帮助。仅供参考 - 我这样做是为了预处理数据以加载到亚马逊红移中。
  • 不客气。赞成和/甚至接受的答案也很酷;)
猜你喜欢
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 2016-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多