Възможно ли е да превключвате между + и - с помощта на регулярен израз в Java?

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

Когато преместим дясната страна вляво на уравнението, трябва да обърнем знака на оператора от + на - и обратно.

Използвайки java regex replaceAll, можем да заменим всички + с -. В резултат на това всички операторни знаци стават -, което ни прави невъзможно да възстановим всички +.

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


person Terry Li    schedule 03.12.2012    source източник
comment
Наистина не трябва да работите върху математически формули с regex. Използвайте токенизатор и работете с токените.   -  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