Я думаю, что-то вроде этого должно работать:
((?:\w+|\((?1)\))(?:[+*^-](?1)|!)?)\/((?1))
Теперь, это, вероятно, не идеально, но вот идея:
Первая группа, $ 1, это ((?:\w+|\((?1)\))(?:[+*^-](?1)|!)?)
, что:
(A литерал ) или (сбалансированное выражение , заключенное в скобки ), затем необязательный оператор и другое сбалансированное выражение если нужно.
Таким образом, мы можем использовать (?1)
в любом месте регулярного выражения для ссылки на другое сбалансированное выражение.
Рабочий пример: http://ideone.com/PNLOD