use strict; use Regexp::Common; my @tests = ( 'foo(bar)', 'foo bar', 'foo(bar', 'foo bar)', 'foo((bar)', 'foo(bar))', 'foo((bar)))', ); for(@tests) { printf "%12s", $_; s{ [()] }( )xg and tr/ //s unless m/ (? '()'} (?! [)] ) /x; printf " - %s\n", $_; } __output__ foo(bar) - foo(bar) foo bar - foo bar foo(bar - foo bar foo bar) - foo bar foo((bar) - foo bar foo(bar)) - foo bar foo((bar))) - foo bar