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('+');