Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
455 views
in Technique[技术] by (71.8m points)

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

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...