Из-за возможности использования вложенных скобок регулярное выражение не подходит для этой задачи.Лучше использовать синтаксический анализатор математических выражений.
Но это не невозможно.Например, несколько раз , заменяя шаблон
((?=[\w.(])[\w.]*\s*(?:\((?>[^()]+|\((?<O1>)|\)(?<-O1>))*(?(O1)(?!))\))?)\s*\^\s*((?=[\w.(])[\w.]*\s*(?:\((?>[^()]+|\((?<O2>)|\)(?<-O2>))*(?(O2)(?!))\))?)
на
"POWER($1,$2)"
, пока строка не перестанетизменить, он должен быть в состоянии превратить все a^b
в POWER(a,b)
.Пример:
(a+3)^(b+5^(c+3)) + 9 ^ 2 + (A + 3)^3 + (5^7)^(6^(8^9-1)-3)
-> POWER((a+3),(b+5^(c+3))) + POWER(9 ,2 )+ POWER((A + 3),3 )+ POWER((5^7),(6^(8^9-1)-3))
-> POWER((a+3),(b+POWER(5,(c+3)))) + POWER(9 ,2 )+ POWER((A + 3),3 )+ POWER((POWER(5,7)),(POWER(6,(8^9-1))-3))
-> POWER((a+3),(b+POWER(5,(c+3)))) + POWER(9 ,2 )+ POWER((A + 3),3 )+ POWER((POWER(5,7)),(POWER(6,(POWER(8,9)-1))-3))
-> done
Обратите внимание, что это регулярное выражение будет предполагать, что ^
ассоциативно слева, а не справа.
1^2^3
-> POWER(1,2)^3
-> POWER(POWER(1,2),3)
-> done
, хотя сам 1 ^ 2 ^ 3 не очень хорошо-formed.