How can I use a variable for a regex pattern without interpreting meta characters?
$text_to_search = "example text with [foo] and more";
$search_string = "[foo]";
if ($text_to_search =~ m/$search_string/)
print "wee";
Please observe the above code. For some reason I would like to find the text "[foo]" in the $text_to_search variable and print "wee" if I find it. To do this I would have to ensure that the [ and ] is substituted with [ and ] to make Perl treat it as characters instead of operators.
How can I do this without having to first replace [
and ]
wi开发者_Python百科th \[
and \]
using a s///
expression?
Use \Q
to autoescape any potentially problematic characters in your variable.
if($text_to_search =~ m/\Q$search_string/) print "wee";
Update: To clarify how this works...
The \Q
will turn on "autoescaping" of special characters in the regex. That means that any characters which would otherwise have a special meaning inside the match operator (for example, *
, ^
or [
and ]
) will have a \
inserted before them so their special meaning is switched off.
The autoescaping is in effect until one of two situations occurs. Either a \E
is found in the string or the end of the string is reached.
In my example above, there was no need to turn off the autoescaping, so I omitted the \E
. If you need to use regex metacharacters later in the regex, then you'll need to use \E
.
Use the quotemeta
function:
$text_to_search = "example text with [foo] and more";
$search_string = quotemeta "[foo]";
print "wee" if ($text_to_search =~ /$search_string/);
You can use quotemeta (\Q \E)
if your Perl is version 5.16 or later, but if below you can simply avoid using a regular expression at all.
For example, by using the index
command:
if (index($text_to_search, $search_string) > -1) {
print "wee";
}
精彩评论