Beefy Boxes and Bandwidth Generously Provided by pair Networks Bob
P is for Practical
 
PerlMonks  

Re: Detecting if a string is a regular expression

by BrowserUk (Pope)
on Jan 11, 2013 at 00:29 UTC ( #1012770=note: print w/ replies, xml ) Need Help??


in reply to Detecting if a string is a regular expression

To test if a string contains regex metachars, quotemeta it and compare it to the original:

print "$_: does", ($_ eq quotemeta() ? 'not' : '' ), 'contain metachar +s' for 'a.c', '[abc]', 'abcd';; a.c: does contain metachars [abc]: does contain metachars abcd: does not contain metachars

Of course, that doesn't test if the metachars make sense as a regex.


With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.


Comment on Re: Detecting if a string is a regular expression
Download Code
Re^2: Detecting if a string is a regular expression
by LanX (Abbot) on Jan 12, 2013 at 11:03 UTC
    for completeness:

    > Of course, that doesn't test if the metachars make sense as a regex

    let's Perl parse Perl =)

    $ perl -ple ' $_ = eval "sub { /$_/ }" ? "OK\n" : "$@" ' a OK a( Unmatched ( in regex; marked by <-- HERE in m/a( <-- HERE / at (eval 2 +) line 1, <> line 2. a[ Unmatched [ in regex; marked by <-- HERE in m/a[ <-- HERE / at (eval 3 +) line 1, <> line 3. a() OK

    Cheers Rolf

    UPDATE

    unfortunately not always correct:

    $ perl -ple ' $_ = eval "sub { /$_/ }" ? "OK\n" : "$@" ' a[$] OK

    but

    $ perl -e ' "abc" =~ /a[$]/ ' Unmatched [ in regex; marked by <-- HERE in m/a[ <-- HERE 5.010000/ at + -e line 1.

    UPDATE

    interesting, this happens because it's a run-time error ... (why?)

    $ perl -e 'sub {"aaa" =~ /a[$]/}' $ perl -e '"aaa" =~ /a[$]/' Unmatched [ in regex; marked by <-- HERE in m/a[ <-- HERE 5.010000/ at + -e line 1. $ perl -ce '"aaa" =~ /a[$]/' -e syntax OK

    looks like a parser problem for me!

    UPDATE

    variable interpolation is part of the problem, a[$] is a valid pattern, as long as it's not interpolated:

    perl -E 'say q(a$) =~ q(a[$]) ' 1

    UPDATE

    this is very reliable

    perl -ple ' $_ = eval "sub { 'a' =~ q\0$_\0 }" ? "OK\n" : "$@" '

    to avoid problems with \0-delim consider using here-docs instead, or even a pack/unpack combination

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1012770]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (6)
As of 2014-04-18 01:48 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (460 votes), past polls