Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re^2: Regex::Reverse tricky test cases

by Roy Johnson (Monsignor)
on May 17, 2005 at 13:16 UTC ( [id://457786]=note: print w/replies, xml ) Need Help??


in reply to Re: Regex::Reverse tricky test cases
in thread Regex::Reverse tricky test cases

See my answer to dragonchild for why. I'm sorry, I thought everybody knew about sexeger, which was probably a pretty foolish assumption. Here are a couple of regexes I've run through my program:
Before: (?i-msx:a(ab)(cd)\2\1) After: (?i-msx:(ba)(dc)\2\1a) Before: (?-imsx:\d+[abc]def(foo|bar)) After: (?-imsx:(oof|rab)fed[abc]\d+)
Note that the 2nd is from japhy's seminal work on the subject, and differs from his reversal: alternatives should maintain their order (foo|bar becomes oof|rab, not rab|oof).

Caution: Contents may have been coded under pressure.

Replies are listed 'Best First'.
Re^3: Regex::Reverse tricky test cases
by dragonchild (Archbishop) on May 17, 2005 at 13:31 UTC
    Ah. I understand now.

    How would you reverse the following: /(?<\d+)(A)\1/


    • In general, if you think something isn't in Perl, try it out, because it usually is. :-)
    • "What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against?"
      Is that supposed to be a variable-length lookbehind (it lacks an =)? Perhaps ironically, I haven't put any handling for lookahead/behind in my program.

      What I would need to do is to convert lookbehinds to lookaheads, and vice-versa. Other than that, the normal reversing would work. Ok, I've done that. Program says:

      Before: (?-imsx:(?<=\d+)(A)\1) After: (?-imsx:(A)\1(?=\d+))

      Caution: Contents may have been coded under pressure.
        You're right, I should have been more careful. The regex I was trying to write (if I'd actually tested it) should have been: (?-imsx: ((?<=\d+))(A)\1) - I forgot that (?<=) is non-capturing.

        Your reversal fails, in large part because I didn't give you any test input.

        my $string = "123A1234"; my $regex = qr/((?<=\d+))(A)\1(.*)/; my ($num, $letter, $leftover) = $string =~ $regex; ok( $num eq '123' ); ok( $letter eq 'A' ); ok( $leftover eq '4' ); ---------------------------------------------------------- my $rev_string = "4321A321"; my $rev_regex = qr/.../; # <-- what goes here?? my ($leftover, $letter, $num) = $rev_string =~ $rev_regex; ok( $num eq '123' ); ok( $letter eq 'A' ); ok( $leftover eq '4' );

        • In general, if you think something isn't in Perl, try it out, because it usually is. :-)
        • "What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against?"

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others cooling their heels in the Monastery: (5)
As of 2024-04-25 08:51 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found