Регулярное выражение для разделения математической функции

#java #regex #math #calculator

#java #регулярное выражение #математика #калькулятор

Вопрос:

Я программирую калькулятор производных, и мне нужно разделить заданный вывод строки на массив строк, но моя текущая команда разделения не очень хорошо работает с отрицанием, и мне нужно, чтобы она НЕ разделяла знак минус после *,/,^,(, sin(,cos(,tan( (Я все еще не внедрил sin, cos и tan в свой код, но я это сделаю, поэтому я хочу знать, как не разделять знак минус после него).

Код:

 public class Graph {
    private String function;
    private final String ONLY_POSITIVE_DELIMITER = "(?<=[ -/*^()])|(?=[ -/*^()])";
    public Graph(String function) {
        this.function = function;
    }

    public String getDerivative() {
        return null;
    }
    private List<String> getArguments() {
        String[] split = function.split(ONLY_POSITIVE_DELIMITER);

        List<String> args = new ArrayList<>(Arrays.asList(split));
        System.out.println("Splitten der Funktion: " args);
        return args;

    } 
 }
 

Это превратит 1 — (-2 * -1) -3 в [1, -, (, -, 2, *, -, 1, ), -, 3] , но я хочу, чтобы оно превратилось в: [1, -, (, -2, *, -1, ), -, 3]

Комментарии:

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

2. Я сделал это, потому что думал, что вы имеете в виду тот факт, что выражение недостаточно ясно.

Ответ №1:

Используя существующий шаблон, вы можете удалить из - первого символьного класса и добавить дополнительную альтернативу для утверждения a - слева, за которым непосредственно не следует один из *,/,^,(,sin(,cos(,tan(

 (?<=[ /*^()])|(?=[ /*^()-])|(?<=-(?<!(?:[*/^(]|(?:sin|cos|tan)()-))
 

Демонстрация регулярных выражений | Демонстрация Java

 String ONLY_POSITIVE_DELIMITER = "(?<=[ /*^()])|(?=[ /*^()-])|(?<=-(?<!(?:[*/^(]|(?:sin|cos|tan)\()-))";
String function = "1-(-2*-1)-3";
String[] split = function.split(ONLY_POSITIVE_DELIMITER);

List<String> args = new ArrayList<>(Arrays.asList(split));
System.out.println("Splitten der Funktion: " args);
 

Вывод

 Splitten der Funktion: [1, -, (, -2, *, -1, ), -, 3]