删除开头和结尾中的双引号;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进行解析。