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

This is a good example of what makes it difficult. In addition to showing me that I need to renumber my backreferences properly, I still get no match with the generated regex, qr/(.*)((?=\d+))(A)\2/, because you can't swap a lookaround for a real match.

So lookarounds in conjunction with backreferences are what really make it difficult. (Incidentally, your suggested pattern is illegal, because the lookbehind is variable-length.)


Caution: Contents may have been coded under pressure.

Replies are listed 'Best First'.
Re^7: Regex::Reverse tricky test cases
by dragonchild (Archbishop) on May 17, 2005 at 14:58 UTC
    In addition to showing me that I need to renumber my backreferences properly, I still get no match with the generated regex, qr/(.*)((?=\d+))(A)\2/, because you can't swap a lookaround for a real match.

    First, I think you want (.*?), not (.*).

    Second, the biggest problem with reversing against the string is the need to have the parsing be ( 4, 321, 'A' ), not ('', 4321, 'A' ) as will have to happen with the \d+. The issue is you need to know what the stuff in \2 is before you match ((?=\d+)).

    Also, positive-lookahead is not the direct reversal of negative-lookbehind. For one thing, it's a zero-width assertion that will fail as written because you can't have numbers and letters in the same position. I think it's better reversed as qr/(.*?)\2(A)((?=\d+))/, which makes no sense because \2 isn't populated when it needs to be.

    (Incidentally, your suggested pattern is illegal, because the lookbehind is variable-length.)

    Yes, it is. But, that's one of the main considerations you gave for wanting to have a regex reverser ...


    • 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?"
      I think I would reverse it as qr/(.*?)(\d+)(A)(?=\2)/. But I'm not at all sure how to make a rule I could apply to a YAPE::Regex tree.

      Caution: Contents may have been coded under pressure.
        I don't know about the YAPE::Regex tree, but the rule seems to be: If you have a negative lookbehind and a backreference to it, it stays in the same position, but becomes a positive lookahead on the backreference to its mirror'ed element.

        • 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?"