如何让我的Perl正则表达式不使用插值变量中的特殊字符?

Rad*_*adz 2 regex perl

可能重复:
当我在Perl的匹配运算符中插入变量时,如何转义元字符?

我使用以下正则表达式$word在更大的字符串中搜索字符串$referenceLine,如下所示:

$wordRefMatchCount =()= $referenceLine =~ /(?=\b$word\b)/g
Run Code Online (Sandbox Code Playgroud)

当我的$word子字符串包含一些(等等时会发生问题.因为它将它作为正则表达式的一部分而不是匹配的字符串,并给出以下错误:

Unmatched ( in regex; marked by <-- HERE in 
m/( <-- HERE ?=\b( darsheel safary\b)/ 
at ./bleu.pl line 119, <REFERENCE> line 1.
Run Code Online (Sandbox Code Playgroud)

可以告诉我一个解决方案吗?我想如果我能够以某种方式让perl理解我们想要在$word不进行评估的情况下寻找整体,那么它可能会成功.

Tim*_*ker 11

使用

$wordRefMatchCount =()= $referenceLine =~ /(?=\b\Q$word\E\b)/g
Run Code Online (Sandbox Code Playgroud)

告诉正则表达式引擎将每个字符$word视为文字字符.

\Q标记开头,\E标记Perl正则表达式中文字字符串的结尾.

或者,你可以做到

$quote_word = quotemeta($word);
Run Code Online (Sandbox Code Playgroud)

然后使用

$wordRefMatchCount =()= $referenceLine =~ /(?=\b$quote_word\b)/g
Run Code Online (Sandbox Code Playgroud)

还有一件事(从评论中可以找到更难找到的东西:

由于单词边界锚,您的正则表达式在示例中失败\b.该锚在单词字符和非单词字符之间匹配.只有放在实际的单词周围才有意义,即\bbar\b确保只bar匹配,而不是foobarbarbaric.如果你把它放在非单词(如\b( darsheel safary\b)中,那么它将导致匹配失败(除非在之前有一个字母,数字或下划线().