如何在Perl中转义看起来像正则表达式的字符串

时间:2017-01-06 15:56:56

标签: regex perl escaping

我有一个脚本,除其他外,搜索文本文件列表以用另一个路径替换Windows路径(文本字符串)。

问题是某些文件夹名称以数字和短划线开头。 Perl似乎认为我试图在这里调用正则表达式。我收到消息,"在正则表达式中引用不存在的组"。

字符串如下所示:

\\\BAGlobal\6-Engineering\3-Tech

我引用了这样的话:

 my $find = "\\\\\\\BAGlobal\\\6-Engineering\\\3-Tech"

如何逃避6-3-

1 个答案:

答案 0 :(得分:5)

问题不是6-中的破折号,而是所有反斜杠\

它认为\3\6是对以前匹配的群组的反向引用,例如/foo(bar) foo\1/会匹配字符串foobar foobar

如果您在模式匹配中使用此功能,则需要添加\Q\E来添加引用,或将quotemeta built-in应用于$find

my $find = '\\\\\\\BAGlobal\\\6-Engineering\\\3-Tech';

$string =~ m/\Q$find\E/;

quotemeta

my $find = quotemeta '\\\\\\\BAGlobal\\\6-Engineering\\\3-Tech';

$string =~ m/$find/;

另见perlre

请注意,您的示例代码可能有误。你在那里的反斜杠数是不均匀的,并且双引号""插值,因此每对反斜杠\\在字符串中变成一个实际的反斜杠。但是因为你有7个,所以最后一个被视为B的转义,将其转换为\B,这不是有效的转义序列。我在上面的代码中使用了单引号''