1

我正在尝试编写正则表达式来删除一行上的空字符串(并且不关心列表项之间的空格),例如:baz foo, "","", bar, ""变为baz foo, bar

到目前为止我正在尝试

$newLine =~ s/""\s*?,//g;
$newLine =~ s/,\s*?""//g;

但鉴于baz "", foo, ""它正在回归baz foo, "",但我希望它回归baz foo

谁能解释出了什么问题/我该如何解决?

谢谢

4

2 回答 2

1

您的代码对我有用:

$string = 'baz "", foo, ""';
$string =~ s/""\s*?,//g;
$string =~ s/,\s*?""//g;
print "$string\n";

退货

baz  foo

为了我。

编辑:正如下面的评论中所述,它不适用于 string baz "", ""。那是因为第一个正则表达式在第二个正则表达式,之前消耗了右边"",导致第二个正则表达式不匹配。

正则表达式的替代方法是使用map.

$string = 'baz "", "", foo';
$string = join(" ", map { $_ =~ s/\s*""\s*//g; $_; } (split(/\s*,\s*/, $string)));

这将设置$stringbaz foo

于 2013-10-04T11:50:29.073 回答
1

拆分字符串更容易,删除不包含任何内容的元素""(可能还有周围的空格)并将它们重新连接起来。

以下可能对您有用:

@foo = grep { !/\s?""\s?/ } split /,/, $newLine;
$newLine = join(',', @foo);

例子:

$ cat mmm
$newLine = 'baz foo, "","", bar, ""';
@foo = grep { !/\s?""\s?/ } split /,/, $newLine;
$newLine = join(',', @foo);
print $newLine . "\n";
$ perl mmm
baz foo, bar
于 2013-10-04T12:02:42.920 回答