我有一个字符串$regexp_as_string
现在我想将它“转换”为正则表达式/将其用作regexp
if ($text_to_search =~ $regexp_as_string)
{
...
}
现在有像“。”这样的字符。我想自动逃避它们 - \ Q和\ E应该这样做
if ($text_to_search =~ /\Q$regexp_as_string\E/)
{
...
}
有没有办法指定应自动转义的字符列表?因为此刻汽车逃脱的方式例如“|” ,但我想保留它。
答案 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”
中的字符添加反斜杠请注意,我在方括号中的字符前放了一个黑色斜杠。对于此上下文中的所有字符,这并不总是必需的,但更容易添加反斜杠而不用担心它。