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

删除开头和结尾中的双引号;perl中管道分隔行中字符串的结尾,perl,Perl,我有一条以管道分隔的线: John |DEMME|"9 Snowy "" Court"|WERRIBEE|""VIC"" 我将行拆分到每个字段 @fields = split (/\|/, $_); 我想删除每个字段开头/结尾的双引号 但它应该保留中间的双引号 预期产量 John |DEMME|9 Snowy "" Court|WERRIBEE|VIC 我也试过这个 s/^\"|"$//g; 但它所做的是它不是按行而是按字段读取,因此它只会删除行的开头和结尾处的双QOUTE 另一种情况:

我有一条以管道分隔的线:

John |DEMME|"9 Snowy "" Court"|WERRIBEE|""VIC""
我将行拆分到每个字段

@fields = split (/\|/, $_);
我想删除每个字段开头/结尾的双引号 但它应该保留中间的双引号

预期产量

John |DEMME|9 Snowy "" Court|WERRIBEE|VIC
我也试过这个

s/^\"|"$//g;
但它所做的是它不是按行而是按字段读取,因此它只会删除行的开头和结尾处的双QOUTE

另一种情况:

John |DEMME| "Shop 6A ""Atlantic on Coolum""|WERRIBEE|VIC
输出应该是

John |DEMME| Shop 6A "Pacific on Coolum"|WERRIBEE|VIC
我希望你们能帮我


非常感谢

如果是逐行阅读,那么您可以写:

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

s/(?:^ |)(?还可以使用
map
表达式从每个字段中删除引号:

@fields = map { s/^"(.*)"$/$1/; $_  } split (/\|/, $_);
split
将行拆分为一个列表,而
map
将替换应用于列表中的每个成员。要将它们重新连接起来:

打印连接(“|”,@fields),“\n”

试试这个

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

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

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

}

谢谢,太棒了!它成功了!但是如果不太麻烦的话,请你至少帮我理解你的代码,我真的很想学习perl正则表达式。thanks@Soncire:当然可以。你对哪一部分有问题?(?:^|)(?这部分“|”->这部分(?=$|\|)->这部分:)@Soncire:
“|”
实际上不是一部分;
表示交替,这里的两个交替是
(?:^ |)(?[续]
(?:^ |)(?那不应该是
John | DEMME | 9 Snowy“Court | WERRIBEE | VIC
?@ikegami nope没关系,谢谢。)@ikegami但是如果我想要这样的输出,我会在这个正则表达式中做什么改变呢^|(?我会查看Text::CSV_XS并使用管道作为分隔符。如果
是转义的
,我会使用Text::CSV_XS进行解析。