in reply to A complex recursive regex,help

See how you get on with this?

$s = "x|xx|xx|xxxx|xx|xxx|xx|xx|x"; $s =~ s[(x\|x)(x\|x)([x\|]*)][$1 $2$3]g; print $s; x|x x|xx|xxxx|xx|xxx|xx|xx|x

Examine what is said, not who speaks.

The 7th Rule of perl club is -- pearl clubs are easily damaged. Use a diamond club instead.

Replies are listed 'Best First'.
Re: Re: A complex recursive regex,help
by OM_Zen (Scribe) on Feb 06, 2003 at 01:07 UTC
    Hi BrowserUk,

    My request was not clear, I think , Actually I need all the |xx| changed to |x x| and hence now I have used the tachyon answer of backward and forward assertion which I did not know much on before and I have seen your node once that uses < > code and then assigning $1 to a local variable inside the regex itself which was a lovely piece of regex , but I sure have to read and practice it thoroguhly BrowserUk, about backward, forward asssertions,and few other concepts of regex,THANKS A BUNCH



      Sorry. I misunderstood your requirement (though it could have been stated a little more clearly:^).

      This one (I think does what you want, edge case as well and is relatively simple.

      $s = "xx|xx|xxxx|xx|xxx|xx|xx|xx"; $s =~ s[(?<!x)(x)(x)(?!x)][$1 $2]g; print $s; x x|x x|xxxx|x x|xxx|x x|x x|x x

      Update Thinking about it, stick with tachyon's as this will fall over if your data contains any occurance of xx without |'s or x's on either side.


      Examine what is said, not who speaks.

      The 7th Rule of perl club is -- pearl clubs are easily damaged. Use a diamond club instead.

        Hi ,

        The cases where the xx appears last are clearly taken care of by your regex BrowserUk,the part I am not understanding is that you are saying that it will fall over if yout date containes any occurances of xx without |'s or x's on either side, please give an instance of this BrowserUk, in terms of data to facilitate the understanding as yoru regex is doing pretty good in all data strings