Найти открытую / закрытую скобку для вложенных дробей

Для некоммерческого математического сайта мне понадобится функция, с помощью которой я могу обнаружить вложенные дроби из строки, а затем применить следующий метод к числителю / знаменателю

var a = nerdamer('divide((numerator),(denominator))');

Так что, если пользователь вводит данные, такие как

( a^2-b^2 ) / (a-b)

результат должен быть + b. Однако это также должно работать с вложенными дробями.

Я пытался сделать это с помощью Regex, но мне не удалось. Поэтому я прошу здесь о помощи.

С наилучшими пожеланиями, Леон

1

Решение

Прежде всего я хотел бы указать на две вещи.
1. Я автор всезнайки
2. Nerdamer — это библиотека JavaScript, но этот вопрос помечен как PHP.

Я не уверен, что вам известны методы знаменателя и числителя. Так, например.

var result1 = nerdamer('(4a^2-b^2)/(2a-b)').denominator();
console.log(result1.toString()); //-b+2*a

Возможно, вы уже пробовали это и заметили, что это не работает для примеров, как указано выше. Итак, следующее

var result2 = nerdamer('(4x^2-9y^2 )/(2x+3y)+(4a^2-b^2)/(2a-b)').denominator();
console.log(result2.toString()); //1

Чтобы решить эту проблему, вам может потребоваться прямой доступ к символу и использование недокументированного метода с именем collectSymbols, Таким образом, вы могли бы сделать следующее

var terms = nerdamer('(4x^2-9y^2 )/(2x+3y)+(4a^2-b^2)/(2a-b)').symbol.collectSymbols();
console.log(terms.toString()); //[(-9*y^2+4*x^2)*(2*x+3*y)^(-1),(-b+2*a)^(-1)*(-b^2+4*a^2)]

Это возвращает массив, содержащий все «условия». Проблема в том, что это может иметь непредвиденные последствия, так как

var unintended = nerdamer('(a+b)(x-y)').symbol.collectSymbols();
console.log(unintended.toString()); //[-y+x,a+b]

Таким образом, чтобы быть в безопасности, проверьте с помощью isComposite метод. Решение в конечном итоге будет

var symbol = nerdamer('(4x^2-9y^2 )/(2x+3y)+(4a^2-b^2)/(2a-b)').symbol;
if(symbol.isComposite()) {
var terms = symbol.collectSymbols();
var denominators = terms.map(function(x) {
return nerdamer(x).denominator();
});
console.log(denominators.toString()); //[2*x+3*y,-b+2*a]
}

Надеюсь, это решение, которое вы ищете.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]