Skip to main content
 首页 » 编程设计

regex之如何在不解释元字符的情况下将变量用于正则表达式模式

2024年04月18日66arxive

$text_to_search = "example text with [foo] and more"; 
$search_string = "[foo]"; 
 
if ($text_to_search =~ m/$search_string/) 
    print "wee"; 

请遵守上面的代码。出于某种原因,我想在 $text_to_search 变量中找到文本“[foo]”,如果找到它,则打印“wee”。为此,我必须确保将 [ 和 ] 替换为 [ 和 ],以使 Perl 将其视为字符而不是运算符。

如何才能做到这一点,而不必先用 \[\] 替换 []使用 s/// 表达式?

请您参考如下方法:

使用 \Q 自动转义变量中任何可能有问题的字符。

if($text_to_search =~ m/\Q$search_string/) print "wee"; 

更新:澄清其工作原理...

\Q 将打开正则表达式中特殊字符的“自动转义”。这意味着任何在匹配运算符内具有特殊含义的字符(例如,*^[ ])将在它们之前插入一个 \,以便关闭它们的特殊含义。

在发生两种情况之一之前,自动转义一直有效。在字符串中找到 \E 或到达字符串末尾。

在上面的示例中,不需要关闭自动转义,因此我省略了 \E。如果您稍后需要在正则表达式中使用正则表达式元字符,则需要使用 \E