Java.util.regex.PatternSyntaxException: Висячий метасимвол "+" рядом с индексом 0 +
Когда я запускаю свой пользовательский интерфейс, я получаю сообщение об ошибке, которое приводит к тому, что этот код выдает ошибку в заголовке. Это работает для всех моих других символов оператора, поэтому я действительно не уверен, что здесь происходит. Я не хотел публиковать весь код, чтобы вы могли найти остальные, если этого недостаточно на моем gitHub: https://github.com/jparr721/Calculator-App/tree/master/src/calculator
public class Calculation_Controls {
public double A, B;
private String[] operators = new String[] {"-","+","/","*","x","^","X"};
/**
* Check for the symbol being used within the TextArea to then
* apply the correct caculation method.
* FIXME - Allow for multiple symbols to be used and have them return
* FIXME - a result in accordance with PEMDAS
*
*@param nums
*
* @return operator, or error
*/
public String findSymbol(String nums) {
for (String operator : operators) {
if (nums.contains(operator)) {
return operator;
}
}
return "invalid input";
}
/**
* Input method to take the user input from the text area
* and apply the correct calculation to it
*
* @param nums - Stores the input as a String which I then convert to an int
* then back to a string to be printed to the TextArea
*
* @return - The result of the calculation as a string
*/
public String input(String nums){
String operator = findSymbol(nums);
if (operator == null){
System.out.println("Invalid input");
}
String[] split = nums.split(operator);
int left = Integer.parseInt(split[0]);
int right = Integer.parseInt((split[1]));
String result = "";
switch (operator){
case "+":
result = Double.toString(add(left, right));
break;
case "-":
result = Double.toString(subtract(left, right));
break;
case "*":
case "x":
case "X":
result = Double.toString(multiply(left, right));
break;
case "/":
result = Double.toString(divide(left, right));
break;
case "^":
result = Double.toString(pwr(left, right));
break;
default:
System.out.println("Invalid Operator");
}
return result;
}
Ответы
Ответ 1
В Regex есть зарезервированный символ, и вы должны использовать этот символ для достижения желаемого. Например, вы не можете использовать String.split("+")
, вы должны использовать String.split("\\+")
.
Правильными операторами будут:
String[] operators = new String[] {"-","\\+","/","\\*","x","\\^","X"};
Ответ 2
в вашем случае +
*
и ^
рассматриваются с особым значением, чаще всего называемым метасимволами. String.split()
принимает выражение regex как аргумент и возвращает массив String
. Чтобы избежать обработки выше как метасимволов, вам необходимо использовать эти escape-последовательности в вашем коде "\\+"
"\\*"
"\\^"
измените свой операторский массив следующим образом
private String[] operators = new String[] {"-","\\+","/","\\*","x","\\^","X"};
для более подробной ссылки на эти ссылки regex.Pattern и String.split()
Ответ 3
метод split() использует regex. символ '+' является специальным символом в регулярном выражении, поэтому вам нужно избежать его с помощью символа обратной косой черты ('\'). Но вам также нужно избегать символа обратной косой черты в java, поэтому вам нужны две обратные косые черты, например. "\\ +"
Ответ 4
Изменить: String[] split = nums.split(operator);
К этому: String[] split = nums.split("\\" + operator);
edit: Это будет работать только для стандартных операторов, а не для x или X. Вам придется изменить свое объявление String[] operators
на самом деле, как и на другой ответ. Лично, хотя я бы сделал некоторую проверку ввода и заменил() на x
или x
на *
вместо
Ответ 5
вы можете использовать case String.valueOf('+');