#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]