Принятый ответ не может справиться с множеством основных случаев.
Это должно сделать работу:
^([-+]? ?(\d+|\(\g<1>\))( ?[-+*\/] ?\g<1>)?)$
Explaination:
Мы хотим сопоставить всю строку:
^...$
Выражения могут иметь знак:
[-+]? ?
Выражение состоит из нескольких цифр или другого допустимого выражения, заключенного в квадратные скобки:
(\d+|\(\g<1>\))
За допустимым выражением может следовать операция и другое допустимое выражение, и оно все еще является действительным выражением:
( ?[-+*\/] ?\g<1>)?