my $balpar_re=qr{ ( \( # opening ( (?:[^'"()]++ # Not a ', ", ( or ) - no backtracking # incorrect |(?:'(?:[^']|\')*?') #' a single quote string # incorrect |(?:"(?:[^"]|\")*?") #" a double quote string |(?:'(?:\\'|[^'])*?') #' a single quote string |(?:"(?:\\"|[^"])*?") #" a double quote string |(?-1) # must be a ( or ) so recurse )*+ # zero or more time - no backtracking \) # closing ) ) }x;