Можно ли переключаться между + и - с помощью регулярных выражений в Java?

6*x + 7 = 7*x + 2 - 3*x

Когда мы перемещаем правую часть уравнения влево, нам нужно поменять знак оператора с + на - и наоборот.

Используя регулярное выражение Java replaceAll, мы можем заменить все + на -. В результате все знаки операторов становятся минусами, что делает невозможным восстановление всех плюсов.

В качестве обходного пути я перебираю строку и меняю + на - при встрече с ней и наоборот. Но мне все еще интересно, есть ли способ переключаться между парами логических значений с помощью регулярных выражений в Java?


person Terry Li    schedule 03.12.2012    source источник
comment
Вы действительно не должны работать над математическими формулами с регулярным выражением. Используйте токенизатор и работайте с токенами.   -  person Daniel Hilgarth    schedule 03.12.2012
comment
Создайте синтаксическое дерево из строки, обработайте дерево, а затем выполните рендеринг обратно в строку. Гораздо меньше хлопот и гораздо меньше ошибок.   -  person Cubic    schedule 03.12.2012


Ответы (2)


Вы можете использовать этот трюк:

String equation = "<Your equation>"
equation = equation.replaceAll("+","$$$");
equation = equation.replaceAll("-","+");
equation = equation.replaceAll("$$$","-");

Предполагая, что $$$ не входит в ваше уравнение.

person giorashc    schedule 03.12.2012
comment
Не очень эффективно использовать 3 replaceAll. Кроме того, вы забыли присвоить результат replaceAll equation. - person Alex; 03.12.2012
comment
Эй, я показал ему трюк. Я не говорил, что это эффективно, просто это более элегантно, чем итерация. - person giorashc; 03.12.2012
comment
И, кроме того, если его уравнения не очень большие, это решение будет работать достаточно быстро, чтобы рассмотреть возможность обмена на какой-то более быстрый, но сложный алгоритм. - person giorashc; 03.12.2012
comment
Я рассматривал идею использования временной переменной. Возможно, вы знаете, что временная переменная не нужна при обмене значениями в таких языках, как Ruby. - person Terry Li; 03.12.2012

В PHP можно сделать следующее:

function swap($m) {
    return ($m[0]=='-')?'+':'-';
}
echo preg_replace_callback( '(\+|\-)', 'swap', '1 + 2 - 3 + 4 - 5');
person TomTom    schedule 03.12.2012
comment
Для JAVA: stackoverflow.com/ вопросы/375420/ - person TomTom; 03.12.2012