1

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

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

我将我的行分成每个字段

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

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

预期产出

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

我也试过这个

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

但它所做的是它不是按行读取而是按字段读取,因此它只会删除行首和行尾的双引号。

另一种情况:

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

输出应该是

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

我希望你们能帮助我解决这个问题。

非常感谢你

4

3 回答 3

2

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

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

"在行首或 a 之后删除|,或在行尾或 a 之前删除|

(?<=...)符号创建一个零宽度正“lookbehind”断言,在这种情况下检查是否有|前面;(?=...)符号创建一个零宽度正“lookahead”断言,在这种情况下检查是否有一个|或文件结尾跟随。)

于 2013-04-04T01:50:29.903 回答
1

试试这个家伙

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

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

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

}
于 2013-04-04T09:06:18.543 回答
0

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

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

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

打印加入('|',@fields),“\n”;

于 2013-04-04T05:04:57.887 回答