RegEx帮助请 - 在引用的字符串中嵌入双引号

时间:2014-09-21 05:55:46

标签: regex

我一直在搜索,浏览stackoverflow RegEx解决方案,直到我出现错误。

我有一个第三方解决方案,提供“制表符分隔文本文件”,但我已经确定生成此文件的任何内容是嵌入双引号(甚至没有转义它们) - 我想知道它是否可能使用RegEx将这些错误从文件中清除(我在导入之前在文件上使用FNR)。

每行数据包含14列,制表符分隔,每个字段周围都有双引号。所有缺陷都发生在字段2或字段10(不是第一个或最后一个字段),因为这些是培训课程 - 一些教师使用名称本身具有双引号的名称 - 并且此第三方报告不会逃脱它们。我希望在正确的引号之前和之后捕获TAB - 并过滤任何内部错误的双引号或使用\“正确地转义它们。”

"......"    "ADC000000" "Being the "Best" you can be"   "2F8A776C"  "...."
"......"    "BBC555555" ""Golden Opportunity""  "8F4C3DEE"  "...."

期望的输出

"......"    "ADC000000" "Being the \"Best\" you can be" "2F8A776C"  "...."
"......"    "BBC555555" "\"Golden Opportunity\""    "8F4C3DEE"  "...."

或(以最简单,最快的速度,文件中有220,000行,只有16-50个错误)

"......"    "ADC000000" "Being the Best you can be" "2F8A776C"  "...."
"......"    "BBC555555" "Golden Opportunity"    "8F4C3DEE"  "...."
抱歉这个的冗长。但我希望问题尽可能清楚。

3 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式来匹配",这些(?<!\t|^)"(?!\t|$) 之前没有制表符或行的开头,也没有后跟制表符或行锚点的结尾。

"

然后将匹配的\\"替换为{{1}}。

DEMO

答案 1 :(得分:0)

您可以匹配前面和后面跟不是标签的字符的任何引号:

s/([^\t])"([^\t])/$1\\"$2/g

($ 1和$ 2将匹配的前后字符放回替换字符串中。确切的语法可能因您的正则表达式引擎而异。)

如果您的正则表达式引擎支持它,您可以使用lookbehind和lookahead使其更简单:

s/(?<!\t)"(?!\t)/\\"/g

答案 2 :(得分:0)

在标签上拆分,然后去除前导和尾随引号:

line.split('\t').map(function(field) { return field.replace(/^"|"$/, ''); })

一般来说,人们似乎正在尝试使用其他方法(例如拆分和扫描)更容易完成更多的正则表达式。