我有一个以管道分隔的行:
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
我希望你们可以帮助我。
非常感谢
答案 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”;