停止正则表达式匹配后选择第一个字符

时间:2014-03-31 11:24:23

标签: regex perl csv delimiter

我有以下格式的csv;

"12345"|"ABC"|"ABC"[tab delimeter]
"12345"|"ABC"|"ABC"[tab delimeter]
"12345"|"ABC"|"ABC"[tab delimeter]

但是,文本中还会显示标签,我需要删除不以“。”开头的标签。

我有以下正则表达式,突出显示没有后跟的标签     \t[^\"] 但这也突出了标签后的字符,我只想选择并删除标签。

注意:不确定这是否重要,但我在运行Perl之前在TextPad中运行命令。

编辑测试数据http://pastebin.com/dYfrcSPc

3 个答案:

答案 0 :(得分:1)

使用这个:

\t(?!")

这意味着tab字符后面没有"字符。

答案 1 :(得分:1)

如果您无法下载Text::CSV等适当的CSV模块,则可以使用属于核心部分的轻量级替代方案:Text::ParseWords

use strict;
use warnings;
use Text::ParseWords;

while (<DATA>) {
    my @list = quotewords('\t', 1, $_);
    tr/\t//d for @list;
    print join "\t", @list;
}

__DATA__
"12345"|"ABC    "|"ABC" next field
"12345"|"ABC"|" ABC"    next field
"123    45"|"ABC"|"ABC" next field

(注意:制表符可能已被stackoverflow格式化破坏)

这将解析行并忽略引用的标签。然后我们可以简单地删除它们并将线重新组合在一起。

答案 2 :(得分:0)

嗯,最简单的方法是使用负面的后视......

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

...因为它只匹配tab字符之前前面 "字符的s/([^"])\t/$1/g; 个字符。但是如果你的perl不支持它,不要担心 - 还有另一种方式:

"

...也就是说,仅用该符号替换任何非\t符号后跟{{1}}。