我正在尝试编写正则表达式来删除一行上的空字符串(而不关心列表项之间的空格),例如:baz foo, "","", bar, ""
变为baz foo, bar
到目前为止,我正在尝试
$newLine =~ s/""\s*?,//g;
$newLine =~ s/,\s*?""//g;
但是在baz "", foo, ""
处,它正在返回baz foo, ""
,但我希望它返回baz foo
。
有人可以解释出现了什么问题/如何解决它?
由于
答案 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