регулярное выражение для pow () - PullRequest
1 голос
/ 22 декабря 2010

Прежде всего, я просто хочу сказать, что я никогда не понимал так хорошо шаблоны регулярных выражений, но я прогрессирую:)

Я хочу создать функцию для замены символа «^» и оставилправильные совпадения с пау ($ 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))" до конца, это не сработаетright.

В основном я хочу, чтобы preg_replace находил первый "()" слева и первый "()" справа от "^" char

Примеры того, как это должно работать(Я сделаю это только для левой части «^», но это также относится и к правой стороне)

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 Ответ

3 голосов
/ 22 декабря 2010

Проблема в том, что вам нужен парсер. Бесконечно вложенные выражения (как в скобках) не могут быть сопоставлены 1 только с помощью регулярных выражений. Учтите это:

(2 ^ (2 ^ (2 ^ (2 ^ (2 ^ (2 ^ (...)))))))

Какое регулярное выражение будет соответствовать этому? Вы можете приблизить его, вы можете сопоставить N уровней этого, но вы не можете сделать все это.

Вы должны сделать парсер. Если вы не хотите, я понимаю, потому что это много работы. Вы можете получить решение для регулярных выражений, которое достаточно для ваших целей сейчас. Но это не будет работать вечно, потому что регулярные выражения недостаточно развиты, чтобы решить эту проблему.


  1. Perl (и совместимые с Perl регулярные выражения) может сделать это, но не должен. Как только вы начнете использовать эти возможности регулярных выражений Perl, он станет нечитаемым. Кроме того, они не (теоретически говоря) регулярные выражения, но на самом деле никому нет дела до теории. : P
...