/( # Capture group 1 \( # Opening paren (?: # Non-capture group [^()]++ # Match non-brackets, no backtracking | (?1) # Recurse to group 1. (?R) works, too. )* # Zero or more times \) # Closing paren | [^+()] # Anything outside of parens not a + or paren )+ # Not *, assuming you only want addition, not # +positive integers at beginning of string (\+ .*) # Plus sign, and remainder of string /x;