Perl正则表达式(使用包含Perl运算符字符的变量作为搜索字符串)

Ste*_*fan 52 regex perl

$text_to_search = "example text with [foo] and more";
$search_string = "[foo]";

if ($text_to_search =~ m/$search_string/)
    print "wee";
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能做到这一点,而不必首先替换[]\[\]使用s///体现在哪里?

Dav*_*oss 62

用于\Q自动显示变量中任何可能存在问题的字符.

if($text_to_search =~ m/\Q$search_string/) print "wee";
Run Code Online (Sandbox Code Playgroud)

  • 你不需要在变量后使用`\ E`吗? (4认同)
  • ++.仅仅为了完整性:你可以使用quotemeta函数得到类似的结果:`$ text_to_search = quotemeta"带有[foo]和更多的示例文本";/$ search_string /`但这会改变$ text_to_search,而不是仅仅在正则表达式中引用. (2认同)
  • @ CJ7:不是这种情况.在正则表达式结束时,`\ Q`会自动关闭. (2认同)

Pla*_*ure 46

使用quotemeta功能:

$text_to_search = "example text with [foo] and more";
$search_string = quotemeta "[foo]";

print "wee" if ($text_to_search =~ /$search_string/);
Run Code Online (Sandbox Code Playgroud)


Bor*_*nov 18

quotemeta (\Q \E)如果你的Perl是5.16或更高版本,你可以使用,但如果你在下面你可以完全避免使用正则表达式.

例如,通过使用index命令:

if (index($text_to_search, $search_string) > -1) {
    print "wee";
}
Run Code Online (Sandbox Code Playgroud)