Это моя часть java-программы для проекта.
String ops="";
String input="1+3-4+(7/8)+cos(sin(50)+2)/2+tan(90)*e^(5+26-4/1*2)";
input=input.replaceAll("cos", "c").replaceAll("sin", "s").replaceAll("tan", "t").replace("e", "2.718");
//System.out.println(input);
Pattern pattern=Pattern.compile("[+-/*()cst^]");
Matcher matcher= pattern.matcher(input);
while (matcher.find()) {ops+=matcher.group();}
System.out.println(ops);
Здесь я просто читаю входные данные и выдаю в них данные +, -,/, *, (,), c, s & t. Вывод ops
должен возвращать +-+(/)+c(s()+)/+t()*^(+-/*)
пока он возвращает +-+(/)+c(s()+)/+t()*.^(+-/*)
Помогите мне понять причину, пожалуйста.
-
используется для диапазона, поэтому +-/
содержит все символы между +
и /
(в таблице ascii), т.е. ,-./
. Для того, чтобы решить эту проблему можно поместить -
в первой позиции:
Pattern.compile("[-+/*()cst^]");
Или вы также можете избежать этого. Подробнее об этом: Как сопоставить дефисы с регулярным выражением?
-
может быть экранирован `. Obviously in java code
`должно быть продублировано, чтобы пропустить java и регулярные выражения.