我想用Perl替换另一个字符串中的固定字符串。两个字符串都包含在变量中。
如果被替换的字符串不可能包含任何正则表达式元字符,我可以这样做:
my $text = 'The quick brown fox jumps over the lazy dog!';
my $search = 'lazy';
my $replace = 'drowsy';
$text =~ s/$search/$replace/;
唉,我希望这适用于任意修复字符串。例如。这应该保持$text
不变:
my $text = 'The quick brown fox jumps over the lazy dog!';
my $search = 'dog.';
my $replace = 'donkey.';
$text =~ s/$search/$replace/;
相反,这会将dog!
替换为donkey.
,因为该点与感叹号相匹配。
假设变量内容本身不是硬编码的,例如它们可以来自文件或来自命令行,有没有办法引用或以其他方式标记变量的内容,以便它们在这种替换操作中不被解释为正则表达式?
或者有更好的方法来处理固定字符串吗?优选的东西仍然允许我使用类似正则表达式的功能,如锚点或反向引用?
答案 0 :(得分:6)
通过quotemeta
:
$search
my $text = 'The quick brown fox jumps over the lazy dog!';
my $search = quotemeta('dog.');
my $replace = 'donkey.';
$text =~ s/$search/$replace/;
遗憾的是,这不允许您使用其他正则表达式功能。如果您有一组精选的功能想要逃脱,也许您可以通过第一个“清理”正则表达式或函数运行$search
,例如:
my $search = 'dog.';
$search = clean($search);
sub clean {
my $str = shift;
$str =~ s/\./\\\./g;
return $str;
}
答案 1 :(得分:5)
使用\Q...\E
包裹您的搜索字符串,引用任何元字符。
$text =~ s/\Q$search\E/$replace/;
答案 2 :(得分:0)
#Replace a string without using RegExp.
sub str_replace {
my $replace_this = shift;
my $with_this = shift;
my $string = shift;
my $length = length($string);
my $target = length($replace_this);
for(my $i=0; $i<$length - $target + 1; $i++) {
if(substr($string,$i,$target) eq $replace_this) {
$string = substr($string,0,$i) . $with_this . substr($string,$i+$target);
return $string; #Comment this if you what a global replace
}
}
return $string;
}