如何匹配'('使用正则表达式?

时间:2012-03-20 15:17:38

标签: regex perl

当我这样做时

#!/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中搜索)并将其替换为\)

6 个答案:

答案 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)

我认为您只需要转义括号,即将)替换为\)