pow()的正则表达式

首先,我只想说我从未理解正则表达式模式,但我正在进步:) 我想创建一个函数来替换“^”char和左边的匹配pow($ 1,$ 2)。我设法达到一个可接受的点,但我从API收到的字符串不断变大和放大更大,现在我被卡住......就像这样:
$str = '(0+1*9^3+3)*(4+5)-(6/7)+(1+2)/(1+1)^((2/3)*3-1+(2/3))';
$str = preg_replace('/([0-9]+|([0-9+-*/]+)|[^+-*/]([S]+))^([0-9]+|([0-9+-*/]+)|[^+-*/]([S]+))/', 'pow($1,$2)', $str);
echo $str;
这适用于给定的字符串,但如果我再添加1个“+(1 + 2)/(1 + 1)^((2/3)* 3-1 +(2/3))'”到最后它不行。 基本上我希望preg_replace从左边找到第一个“()”& “^”字符右边的第一个“()” 它应该如何工作的例子(我只会在“^”的左侧做,但它也适用于右侧)
3+2^3-2 => 3+pow(2, 3)-2
3+(1+1)^3*2 => 3+pow((1+1), 3)*2
3+(1+1+(1+2))^3/2 => 3+pow((1+1+(1+2)), 3)/2
3+((3/3)+(2/2))^2-1 => 3+pow(((3/3)+(2/2)), 2)-1
(3+1)^3-1 => pow((3+1), 3)-1
等等... 以上所有的排序是: 返回“$ 1”之前的“^”: 1.如果“^”之前的第一件事是int,则返回数字 2.如果第一件事是“)”搜索它的对“(并返回其中的所有内容(类似于'/(/([.*]))^/') 对不起我的英语,我希望你能理解......我希望有人可以帮我解决这个问题:( 提前致谢!     
已邀请:
这里的问题是你需要一个解析器。无限嵌套表达式(如括号中)无法仅由正则表达式匹配。考虑一下:
(2 ^ (2 ^ (2 ^ (2 ^ (2 ^ (2 ^ (...)))))))
正则表达式会匹配什么?你可以近似它,你可以匹配N级,但你不能做到这一切。 你应该做一个解析器。如果你不想,我明白,因为这是很多工作。您现在可以获得足够好的正则表达式解决方案。但它不会永远有效,因为正则表达式不足以解决这个问题。 Perl(和Per​​l兼容的正则表达式)可以做到这一点,但它们不应该这样做。一旦你开始使用Perl的正则表达式的这些功能,它就变得不可读了。而且,它们(理论上讲)不是正则表达式,但没有人真正关心理论。 :P     

要回复问题请先登录注册