in reply to regular expression paranthesis remover

If you're unconcerned with their balancing except for the outer ones,

$_ = '111(22(33)44)55'; my $re = qr/ (.*?) # minimal grab up to the first... \( # literal left paren .* # greedy skip everything up through... \) # the last literal right paren (.*)$ # then grab everything remaining /x; s/$re/$1$2/; print;
If they do balance, it works, too. What do you want to happen if they don't balance?

Update: Typo repaired, thanks, Hofmator.

After Compline,
Zaxo

Replies are listed 'Best First'.
Re^2: regular expression paranthesis remover
by Hofmator (Curate) on Jun 25, 2004 at 09:19 UTC

    That's needlessly complicated, simply replace the stuff you don't want with nothing (as Anonymous Monk already said): s/\(.*\)//.

    The balancing caveat still applies, of course.

    Update: thospel is completely correct, my solution above (and Zaxo's) doesn't work for multiple parenthesis in the same string. To fix this (and actually make it recognise balanced parens):

    $_ = "111(22(33)44)55"; 1 while s/ \( [^()]* \) //gx; if (/[()]/) { print "unbalanced!!"; } else { print; }
    BTW, I just noticed a small typo in Zaxo's code, it doesn't work as it stands. It should be my $re = qr/.../;.

    -- Hofmator

      Fails on the perfectly balanced "12(34)56(78)9"

      Assuming it's about removing balanced parenthesis, I'd go for:

      my $balance; # Notice declaring $balance beforehand is important, # otherwise you pick up the global inside (??{}) $balance=qr/(?:[^()]|\((??{$balance})\))*/; $string =~ s/\($balance\)//g;