在开头和开头删除双引号perl中以管道分隔的行中的字符串结尾

时间:2013-04-04 01:48:26

标签: perl

我有一个以管道分隔的行:

John |DEMME|"9 Snowy "" Court"|WERRIBEE|""VIC""

我将我的行拆分为每个字段

@fields = split (/\|/, $_);

我想要的是删除每个字段的开头/结尾的双引号 但它应该保留两者之间的双引号。

预期产出

John |DEMME|9 Snowy "" Court|WERRIBEE|VIC

我也试过这个

s/^\"|"$//g;

但是它的作用是逐行读取而不是字段,所以它只会删除行的开头和结尾处的双重qoutes。

另一种情况:

John |DEMME| "Shop 6A ""Atlantic on Coolum""|WERRIBEE|VIC

输出应该是

John |DEMME| Shop 6A "Pacific on Coolum"|WERRIBEE|VIC

我希望你们可以帮助我。

非常感谢

3 个答案:

答案 0 :(得分:2)

如果按行阅读,那么你可以写:

s/(?:^|(?<=\|))"|"(?=$|\|)//g;

删除行尾或"之后,或行尾或|之前的|

(?<=...)表示法创建一个零宽度正“lookbehind”断言,在这种情况下检查前面是否有|; (?=...)表示法创建零 - width positive“lookahead”断言,在这种情况下检查是否存在|或文件结尾。)

答案 1 :(得分:1)

试试这个家伙

my $_='John |DEMME|"9 Snowy "" Court"|WERRIBEE|""VIC""';

my @fields = split (/\|/, $_);

foreach my $item(@fields){
 $item=~s/^\"+//g;
 $item=~s/\"+$//g;
print "$item";

}

答案 2 :(得分:0)

也可以使用map表达式从每个字段中删除引号:

@fields = map { s/^"(.*)"$/$1/; $_  } split (/\|/, $_);

split将该行拆分为列表,而map将替换应用于列表的每个成员。加入他们备份:

print join('|',@ fields),“\ n”;