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

0 regex perl escaping

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

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

字符串看起来像这样:

\\\BAGlobal\6-Engineering\3-Tech
Run Code Online (Sandbox Code Playgroud)

我引用它是这样的:

 my $find = "\\\\\\\BAGlobal\\\6-Engineering\\\3-Tech"
Run Code Online (Sandbox Code Playgroud)

我怎么逃避6-3-

sim*_*que 5

问题不在于破折号6-而是所有反斜杠\.

它认为\3并且\6是对先前匹配的组的反向引用,就像/foo(bar) foo\1/匹配字符串一样foobar foobar.

如果您在模式匹配中使用它,则需要包括\Q\E添加引号,或将quotemeta内置应用于您的$find.

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

$string =~ m/\Q$find\E/;
Run Code Online (Sandbox Code Playgroud)

或者quotemeta.

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

$string =~ m/$find/;
Run Code Online (Sandbox Code Playgroud)

另见perlre.

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