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.如果第一件事是“)”搜索它的对“(并返回其中的所有内容(类似于'/(/([.*]))^/')
对不起我的英语,我希望你能理解......我希望有人可以帮我解决这个问题:(
提前致谢!
没有找到相关结果
已邀请:
1 个回复
缮淳彼誊
正则表达式会匹配什么?你可以近似它,你可以匹配N级,但你不能做到这一切。 你应该做一个解析器。如果你不想,我明白,因为这是很多工作。您现在可以获得足够好的正则表达式解决方案。但它不会永远有效,因为正则表达式不足以解决这个问题。 Perl(和Perl兼容的正则表达式)可以做到这一点,但它们不应该这样做。一旦你开始使用Perl的正则表达式的这些功能,它就变得不可读了。而且,它们(理论上讲)不是正则表达式,但没有人真正关心理论。 :P