当我这样做时
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $s = 'dfgdfg5 )';
my $a = '5 )';
my $b = '567';
$s =~ s/$a/$b/g;
print Dumper $s;
我得到了
Unmatched ) in regex; marked by <-- HERE in m/5 ) <-- HERE / at ./test.pl line 11.
问题是$a
有一个(
。
如何防止正则表达式失败?
更新
我从数据库查询中获取$a
中的字符串,因此我无法更改它。或者是否可以在$a2
中搜索)
并将其替换为\)
?
答案 0 :(得分:11)
你需要逃脱它。通过在其前面添加反斜杠手动,或使用正则表达式中的quotemeta或\Q
sequence来手动:
$a = quotemeta($a);
或者
$s =~ /\Q$a/$b/g;
ETA:如果您想要匹配数据库查询中的文字字符串,这是一个不错的选择。
您还应该知道,使用$a
和$b
作为变量不是一个好主意,因为它们会掩盖与sort
一起使用的预定义变量。例如。 sort { $a <=> $b } @foo
。
答案 1 :(得分:4)
简单的答案是反斜杠逃避paren。 my $a = '5 \)';
在你的情况下,正如你的帖子所提到的那样,你不是创造字符串的人,所以从字面上来说逃避它们不是一种选择。
将正则表达式插入的变量包装在\ Q ... \ E中可能更简单。
$s =~ s/\Q$a\E/$b/g;
quotemeta()
函数也可能对您有所帮助,具体取决于您的代码的分解方式。使用该选项,您可以在正则表达式中插入之前传递$ a到quotemeta。 \ Q ... \ E在这种情况下可能更容易,但如果您的代码通过使用quotemeta而得到简化,那么它就适合您。
答案 2 :(得分:3)
使用\)
代替)
。 )
是特殊的,因为它通常用于捕获模式,因此您需要先将其转义。
答案 3 :(得分:2)
使用反斜杠转义括号:
my $a = '5 \)'oi;
或者在regexp中使用\ Q:
$s =~ s/\Q$a/$b/g;
此外,在将regexp存储在变量中时,您应该查看regexp引用运算符:http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators
my $a = qr/5 \)/oi;
答案 4 :(得分:1)
在Perl正则表达式中,您需要使用反斜杠\
来掩盖特殊字符。
尝试
my $a = '5 \)';
my $b = '567';
$s =~ s/$a/$b/g;
有关详情和良好开端,请参阅perldoc perlretut
更新:我不知道RE来自数据库。好吧,上面的代码仍然有用。该教程的提示仍然适用。
答案 5 :(得分:0)
我认为您只需要转义括号,即将)
替换为\)