2014-09-21 35 views
1

我一直在搜索,浏览stackoverflow正则表达式解决方案,直到我眼镜蛇。正则表达式帮助 - 嵌入报价字符串中的双引号

我有一个第三方解决方案提供了一个“制表符分隔的文本文件”,但我已经确定了生成这个文件的任何东西是嵌入双引号(甚至没有转义它们) - 我想知道它的可能性使用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" "...." 

或(取是最简单的,并且相当快的文件中都有22万行,只有16-50错误)

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

遗憾的这个冗长,但我想这个问题是因为possi清晰BLE。

回答

1

您可以使用下面的正则表达式来匹配",这些标记或行的开头不是前面的,也不是后跟标签或行结束符。

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

然后更换\\"匹配"

DEMO

+0

非常感谢Avinash的快速响应,这看起来非常接近 - 但也在每行的开头和结尾都选择了引号。有没有办法避免匹配这些情况? – RLW 2014-09-21 12:59:12

+0

不,你看过上面的演示吗? – 2014-09-21 13:01:06

+0

我可能说话太快了,我正在使用debuggex.com尝试自己弄清楚 - 但我遵循了你的演示链接,它没有这个问题。请给我一点时间来弄清楚如何将这些信息提供给FNR。 – RLW 2014-09-21 13:27:21

0

可以匹配不是选项卡的任何引用,既之前和之后的字符:

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

(的$ 1和$ 2将匹配之前和之后的字符后面的取代的字符串中的精确语法可能这取决于你的正则表达式引擎会发生变化)

如果您正则表达式引擎支持它,你可以使用回顾后和预读,使之简单一点:

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

FNR显然使用每个文档的.NET RegEx,与Perl 5 RegEx类似。哪个引擎使用这种s// g格式,也许我可以将它转换为Perl并尝试它。 – RLW 2014-09-21 13:07:07

+0

's /(PATTERN)/(REPLACEMENT)/ g'是Perl用于搜索正则表达式(PATTERN)并用“(REPLACEMENT)”代替它的符号 - 这样就相当于调用例如'replace(string,'(PATTERN)','(REPLACEMENT)')'。 (末尾的'g'表示使用字符串中的所有匹配项,而不仅仅是第一个。) – ptomato 2014-09-21 20:04:50

+0

感谢您的澄清。我不能满足你的答案(我猜想对于论坛来说太新了),但是如果我使用纯Perl(而不是FNR,它具有单独的查找和替换输入),这就是我所需要的。 – RLW 2014-09-22 12:52:01

0

拆分的选项卡,然后去掉开头和结尾的报价:

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

在一般情况下,人们似乎正在试图做太多的正则表达式,可以用其他方法来更容易地完成如分割和扫描。

+0

我肯定有罪,试图用RegExp做些事情,如果我运行某种类型的处理脚本,可能会有更好的解决方案。 ,正确吗?也许我的时间最好花在学习一个非常好的字符串操作语言 - 我可以从Windows批处理运行 - 它是Python吗? – RLW 2014-09-21 12:56:37

+0

如果是Python,则必须添加Python标记(以上是JS,对不起)不管怎么说,不需要一个字符串操作语言来分割和匹配字符串,所有的语言都有这些能力。你花时间学习你正在编写的语言是最好的。 – 2014-09-21 12:59:24