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

时间:2010-10-19 19:20:48

标签: regex perl

  

可能重复:
  How can I escape meta-characters when I interpolate a variable in Perl's match operator?

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

$wordRefMatchCount =()= $referenceLine =~ /(?=\b$word\b)/g

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

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

可以告诉我一个解决方案吗?我想如果我能以某种方式让perl理解我们想要查找整个$word而不进行评估,那么它可能会有用。

1 个答案:

答案 0 :(得分:11)

使用

$wordRefMatchCount =()= $referenceLine =~ /(?=\b\Q$word\E\b)/g

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

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

或者,您可以

$quote_word = quotemeta($word);

然后使用

$wordRefMatchCount =()= $referenceLine =~ /(?=\b$quote_word\b)/g

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

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

相关问题