Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

regex

perl

$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?

like image 205
Stefan Avatar asked Jan 06 '11 15:01

Stefan


People also ask

Can you put a variable inside a regex?

It's not reeeeeally a thing. There is the regex constructor which takes a string, so you can build your regex string which includes variables and then pass it to the Regex cosntructor.

How does regex handle special characters?

To match a character having special meaning in regex, you need to use a escape sequence prefix with a backslash ( \ ). E.g., \. matches "." ; regex \+ matches "+" ; and regex \( matches "(" . You also need to use regex \\ to match "\" (back-slash).

How do I match a pattern in regex?

Regular expressions, called regexes for short, are descriptions for a pattern of text. For example, a \d in a regex stands for a digit character — that is, any single numeral 0 to 9. Following regex is used in Python to match a string of three numbers, a hyphen, three more numbers, another hyphen, and four numbers.


1 Answers

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.

like image 183
Dave Cross Avatar answered Nov 07 '22 10:11

Dave Cross