Perl正则表达式如何只逃避一些字符

时间:2012-02-11 11:15:02

标签: regex perl escaping special-characters

我有一个字符串$regexp_as_string

现在我想将它“转换”为正则表达式/将其用作regexp

if ($text_to_search =~ $regexp_as_string)
{
...
}

现在有像“。”这样的字符。我想自动逃避它们 - \ Q和\ E应该这样做

 if ($text_to_search =~ /\Q$regexp_as_string\E/)
    {
    ...
    }

有没有办法指定应自动转义的字符列表?因为此刻汽车逃脱的方式例如“|” ,但我想保留它。

3 个答案:

答案 0 :(得分:14)

您可以使用quotemeta准备字符串,然后有选择地删除反斜杠。 E.g:

my $str = quotemeta('foo${}|'); 
$str =~ s/\\(?=[|])//g; 
say $str;

<强>输出:

foo\$\{\}|

将您想要未转义的任何字符添加到替换中的字符类中,例如[|?()]

答案 1 :(得分:0)

也许不是传递由|连接的字符串对于替换,获取替换列表并将它们构建为一个字符串(如果保证永远不会出现,甚至将它们拆分)?类似的东西:

my @alternations = array_returning_function();
# my @alternations = split(/\|/, string_returning_function());
my $regexp_as_string = join('|', map(quotemeta, @alternations)); 

或使用Data::Munge的list2re函数:

use Data::Munge;
my @alternations = array_returning_function();
# my @alternations = split(/\|/, string_returning_function());
my $regexp_as_string = Data::Munge::list2re( @alternations );

答案 2 :(得分:0)

使用TLP的示例字符串

my $str='foo${}|';
$str =~ s/([\.\{\}\$])/\\$1/g;
print $str;

这只会为方括号“character class”

中的字符添加反斜杠

请注意,我在方括号中的字符前放了一个黑色斜杠。对于此上下文中的所有字符,这并不总是必需的,但更容易添加反斜杠而不用担心它。