可能重复:
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
而不进行评估,那么它可能会有用。
答案 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
,而不是foobar
或barbaric
。如果你把它放在非单词(如\b( darsheel safary\b
)中那么它会导致匹配失败(除非在(
之前有一个字母,数字或下划线)。