2014-11-22 2 views
0

Я пишу математическое приложение на Java, которое использует Javascript для сценариев/ввода. Я хочу, чтобы иметь возможность ввести, скажем, x^2, и заменить Java на pow(x,2) перед отправкой на парсер JavaScript. Как я могу сделать этот тип замены? В одном фрагменте кода может быть несколько разных выражений, которые могут быть одной или несколькими строками.Замените var^power на pow (var, power)

+1

Java и JavaScript являются различные языки с почти ничего общего для некоторого синтаксиса они оба унаследовали от C. Не перепутать их, за исключением. – cdhowie

+1

@cdhowie Я не. В моем приложении Java используется JavaScript-парсер ('javax.script.ScriptEngine') для оценки введенных выражений в JavaScript. –

+1

Я вижу. Ну, в конечном счете, единственный пуленепробиваемый способ сделать это - написать парсер JavaScript, который сможет распознать вашего дополнительного оператора. Все, что меньше этого, будет иметь оговорки, где замена не делает правильные вещи. Например, если 'x^2' появляется в строковом литерале, вы не хотите его заменять. – cdhowie

ответ

0

UPDATE:

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


Предположим, что вы говорите о javascript, и вы заменяете ввод строки, выполните следующие действия.

"x^2".replace(/(.*)\^(\d+)/, "pow($1, $2)") 
+0

Я бы добавил больше контекста к вашему RegExp для обработки пробелов, негативов и т. Д. – dandavis

+1

Что делать, если 'a^b' появляется в строковом литерале? – cdhowie

+3

Что делать, если пользователь вводит более сложные вещи, такие как 'x^0.5' или' (x + y)^(z-4) '? (Или даже 'x^y^2'.) – nnnnnn

0

попробовать это: обновление: возможно в некоторых случаях

var re = /(?![\+\-\*\/\(\)\^\s])([a-zA-Z0-9]+)\^([a-zA-Z0-9]+)/gm; 
var str = 'w*x^2 +5^9'; 
var subst = 'pow($1,$2)'; 

var result = str.replace(re, subst); 

live demo

И лучше справочником для расчета математической. http://mathjs.org/

пример & выход

// expressions 
math.eval('1.2 * (2 + 4.5)');  // 7.8 
math.eval('5.08 cm to inch');  // 2 inch 
math.eval('sin(45 deg)^2');  // 0.5 
math.eval('9/3 + 2i');   // 3 + 2i 
math.eval('det([-1, 2; 3, 1])'); // -7 
+1

Что делать, если входной сигнал 'y^3 + x^2'? Вопрос гласил: «В одном фрагменте кода может быть несколько разных выражений». – nnnnnn

+0

И 32 * x^2 должны стать 32 * pow (x, 2), а не pow (32 * x, 2). –

+0

Как насчет 'a^(b^c)' или '(a^b)^c'? Удачи в правильном выполнении этих замещений с помощью только регулярного выражения. – cdhowie

3

Вы должны раскошелиться анализатор esprima JS для добавления оператора ^ с соответствующим старшинства и т.д. Затем идти по дереву синтаксического анализа, определить, где он используется, и сделать лексический замена. Эта ссылка может быть полезна: http://ariya.ofilabs.com/2011/08/math-evaluator-in-javascript-part-2.html. Не совсем уверен, как вы это назовете из своей Java-программы, но я уверен, что вы можете это понять.

Или, анализатор в http://mathjs.org/, по-видимому, уже поддерживает ^, так что вы можете использовать его. Или, есть http://silentmatt.com/javascript-expression-evaluator/, который также поддерживает ^. Или http://jsep.from.so/, «крошечный парсер JavaScript-выражений».

Связанные SO вопрос: Safe evaluation of arithmetic expressions in Javascript

Смежные вопросы