Perl正则表达式删除空字符串

时间:2013-10-04 11:46:28

标签: regex perl

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

到目前为止,我正在尝试

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

但是在baz "", foo, ""处,它正在返回baz foo, "",但我希望它返回baz foo

有人可以解释出现了什么问题/如何解决它?

由于

2 个答案:

答案 0 :(得分:1)

您的代码适合我:

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

返回

baz  foo
对我来说。

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

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

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

这会将$string设置为baz foo

答案 1 :(得分: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