How can I use a variable for a regex pattern without interpreting meta characters?

RegexPerl

Regex Problem Overview


$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 ] with \[ and \] using a s/// expression?

Regex Solutions


Solution 1 - Regex

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.

Solution 2 - Regex

Use the http://perldoc.perl.org/functions/quotemeta.html">`quotemeta`</a> function:

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

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

Solution 3 - Regex

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";
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionStefanView Question on Stackoverflow
Solution 1 - RegexDave CrossView Answer on Stackoverflow
Solution 2 - RegexPlatinum AzureView Answer on Stackoverflow
Solution 3 - RegexBoris IvanovView Answer on Stackoverflow