java.util.regex.PatternSyntaxException: metacarácter colgante ‘+’ cerca del índice 0 +

3 minutos de lectura

Avatar de usuario de Jarred Parr
Jarred Parr

Recibo el error cuando inicio mi interfaz de usuario que hace que este código me escupa el error en el título. Funciona para todos mis otros símbolos de operador, así que no estoy seguro de lo que está pasando aquí. No quería publicar todo el código para que puedas encontrar el resto si esto no es suficiente en mi gitHub: https://github.com/jparr721/Calculator-App/tree/master/src/calculator

public class Calculation_Controls {

    public double A, B;

    private String[] operators = new String[] {"-","+","https://stackoverflow.com/","*","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 "https://stackoverflow.com/":
                result =  Double.toString(divide(left, right));
                break;
            case "^":
                result =  Double.toString(pwr(left, right));
                break;
            default:
                System.out.println("Invalid Operator");
        }
        return result;
    }

  • Posible duplicado de String.split() en un metacarácter +

    – njzk2

    25/10/2016 a las 17:43

Avatar de usuario de Paulo
Pablo

Hay caracteres reservados en Regex y debe escapar de estos caracteres para lograr lo que desea. Por ejemplo, no puedes usar String.split("+")tienes que usar String.split("\\+").

Los operadores correctos serían:

String[] operators = new String[] {"-","\\+","https://stackoverflow.com/","\\*","x","\\^","X"};

  • ¡Gracias! en mi caso haciendo $myString.split([+]) de acuerdo con esto: stackoverflow.com/a/21357226/1057052 ¡funcionó! (Usando Apache VTL con AppSync)

    – José A.

    21 de septiembre de 2019 a las 3:18

en tu caso + * y ^ se tratan con un significado especial, más a menudo llamado como metacaracteres. String.split() El método toma una expresión regular como argumento y devuelve un String formación. Para evitar tratar lo anterior como metacaracteres, debe usar estas secuencias de escape en su código "\\+" "\\*" "\\^"

modifica tu matriz de operadores de esta manera

private String[] operators = new String[] {"-","\\+","https://stackoverflow.com/","\\*","x","\\^","X"};

para más detalles consulte estos enlaces patrón de expresión regular y Cadena.split()

  • Esto no funcionó, ¿tiene alguna otra idea de lo que podría estar causando esto?

    – Jarred Parr

    26/10/2016 a las 18:57

puede usar el caso String.valueOf(‘+’);

  • La mayoría de sus respuestas parecen estar recibiendo muchos votos negativos. Lea la sección ¿Cómo escribo una buena respuesta? artículo en la sección de ayuda antes de intentar publicar una respuesta.

    – Céfiro

    10/07/2019 a las 20:45

Cambiar: String[] split = nums.split(operator);

A esto: String[] split = nums.split("\\" + operator);

editar: Esto solo funcionará para los operadores estándar, no para x o X. Tendrá que cambiar su String[] operators declaración en realidad, como la otra respuesta mencionada. Sin embargo, personalmente, haría algún tipo de validación de entrada y haría un reemplazo () en x o X ser * en cambio

el método split() usa expresiones regulares. el símbolo ‘+’ es un carácter especial en expresiones regulares, por lo que debe escapar con el símbolo de barra invertida (‘\’). Pero también necesita escapar del símbolo de barra invertida en java, por lo que necesita dos barras invertidas, por ejemplo, “\\+”

¿Ha sido útil esta solución?