我正在尝试编写正则表达式来删除一行上的空字符串(并且不关心列表项之间的空格),例如:baz foo, "","", bar, ""
变为baz foo, bar
到目前为止我正在尝试
$newLine =~ s/""\s*?,//g;
$newLine =~ s/,\s*?""//g;
但鉴于baz "", foo, ""
它正在回归baz foo, ""
,但我希望它回归baz foo
。
谁能解释出了什么问题/我该如何解决?
谢谢
您的代码对我有用:
$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)));
这将设置$string
为baz foo
拆分字符串更容易,删除不包含任何内容的元素""
(可能还有周围的空格)并将它们重新连接起来。
以下可能对您有用:
@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