Javascript: найти регулярное выражение с захватом, чтобы заменить a^b на Math.pow(a, b)

Моя строка следующая:

str = "(2+2)^(4*(5+6^(5^6))))";

Как видите, сила может быть вложена в другую власть с круглыми скобками или без них.

Поэтому я хочу преобразовать эту строку с помощью регулярного выражения для замены ^ на Math.pow(a,b) из javascript.

Идея? Большое спасибо заранее, сердечно.

2 ответа

Решение

Я думаю, что использование регулярных выражений для разбора выражений не принесет вам пользы...

Почему бы не использовать библиотеку синтаксических анализаторов математических выражений, например http://mathjs.org/

Вот шаги, которые должен выполнить ваш алгоритм:

  1. Найти "корень" ^"символ
  2. Захват групп до и после ^
  3. Повторение

Проблема здесь в том, что этот тип структуры данных является рекурсивным и нерегулярным...

  • Это рекурсивно, так как вы можете иметь бесконечное количество вложенных скобок, и каждый должен быть оценен отдельно
  • Это не регулярно, так как, например, у вас могут быть группы без круглых скобок: (2+2)^2

... что делает поиск указанного "корня ^"проблематично

Кроме того, входные данные не всегда могут быть действительными (например, пользователь забывает закрыть круглые скобки).

Другие вопросы по тегам