在perl中使用单个正则表达式进行多次替换

时间:2010-06-29 12:24:50

标签: regex perl

说我在perl中有以下内容:

my $string;
$string =~ s/ /\\ /g;
$string =~ s/'/\\'/g;
$string =~ s/`/\\`/g;

上述替换是否可以使用单个组合正则表达式而不是3个单独的正则表达式执行?

3 个答案:

答案 0 :(得分:9)

$string =~ s/([ '`])/\\$1/g;

使用character class [ '`]匹配空格之一,'或`并使用方括号()来记住匹配的字符。然后使用$1在替换中包含记住的字符。

答案 1 :(得分:4)

单独的替换可能比单个复杂的替换更有效(例如,当使用固定的子串时)。在这种情况下,您可以缩短代码,如下所示:

my $string;    
for ($string) {
    s/ /\\ /g;
    s/'/\\'/g;
    s/`/\\`/g;
}

答案 2 :(得分:2)

虽然现在可以更容易地阅读它的方式,但您可以通过使用循环或将它们组合在一个表达式中立即执行这些替换:

# loop
$string =~ s/$_/\\$_/g foreach (' ', "'", '`');

# combined
$string =~ s/([ '`])/\\$1/g;

顺便说一下,通过避免“倾斜牙签综合症”,你可以让你的替换更容易阅读,因为各种正则表达式操作符允许你使用各种分隔符:

$string =~ s{ }{\\ }g;
$string =~ s{'}{\\'}g;
$string =~ s{`}{\\`}g;