【发布时间】:2010-06-29 12:24:49
【问题描述】:
假设我在 perl 中有以下内容:
my $string;
$string =~ s/ /\\ /g;
$string =~ s/'/\\'/g;
$string =~ s/`/\\`/g;
是否可以使用单个组合正则表达式而不是 3 个单独的正则表达式来执行上述替换?
【问题讨论】:
假设我在 perl 中有以下内容:
my $string;
$string =~ s/ /\\ /g;
$string =~ s/'/\\'/g;
$string =~ s/`/\\`/g;
是否可以使用单个组合正则表达式而不是 3 个单独的正则表达式来执行上述替换?
【问题讨论】:
$string =~ s/([ '`])/\\$1/g;
使用character class [ '`] 来匹配空格、' 或` 之一,并使用方括号() 来记住匹配的字符。然后使用$1 将记住的字符包含在替换中。
【讨论】:
单独的替换可能比单个复杂的替换更有效(例如,在使用固定子字符串时)。在这种情况下,您可以使代码更短,如下所示:
my $string;
for ($string) {
s/ /\\ /g;
s/'/\\'/g;
s/`/\\`/g;
}
【讨论】:
$string =~ s/($_)/\\$1/g for (q/ /, q/'/, q/`/);
虽然可以说以您现在的方式更容易阅读,但您可以通过使用循环或将它们组合到一个表达式中来一次执行这些替换:
# loop
$string =~ s/$_/\\$_/g foreach (' ', "'", '`');
# combined
$string =~ s/([ '`])/\\$1/g;
顺便说一句,您可以通过避免“倾斜牙签综合症”使您的替换更易于阅读,因为各种正则表达式运算符允许您使用各种分隔符:
$string =~ s{ }{\\ }g;
$string =~ s{'}{\\'}g;
$string =~ s{`}{\\`}g;
【讨论】: