java.util.regex.PatternSyntaxException: Hängendes Metazeichen „+“ in der Nähe von Index 0 +

Lesezeit: 3 Minuten

Benutzeravatar von Jarred Parr
Jarred Parr

Ich erhalte die Fehlermeldung, wenn ich meine Benutzeroberfläche starte, die dazu führt, dass mir dieser Code den Fehler im Titel anzeigt. Es funktioniert für alle meine anderen Operatorsymbole, daher bin ich mir wirklich nicht sicher, was hier los ist. Ich wollte nicht den gesamten Code veröffentlichen, damit Sie den Rest auf meinem GitHub finden können, falls dieser nicht ausreicht: 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;
    }

  • Mögliches Duplikat von String.split() an einem Metazeichen +

    – njzk2

    25. Okt. 2016 um 17:43 Uhr

Paulos Benutzeravatar
Paulo

Es gibt reservierte Zeichen in Regex und Sie sollten diese Zeichen mit einem Scape versehen, um das zu erreichen, was Sie wollen. Beispielsweise können Sie nicht verwenden String.split("+")müssen Sie verwenden String.split("\\+").

Die richtigen Operatoren wären:

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

  • Danke! In meinem Fall tun $myString.split([+]) Demnach: stackoverflow.com/a/21357226/1057052 hat funktioniert! (Verwendung von Apache VTL mit AppSync)

    – José A

    21. September 2019 um 3:18

in Ihrem Fall + * Und ^ werden mit einer besonderen Bedeutung behandelt, die meist als Metazeichen bezeichnet wird. String.split() Die Methode verwendet einen regulären Ausdruck als Argument und gibt a zurück String Array. Um zu vermeiden, dass die oben genannten Zeichen als Metazeichen behandelt werden, müssen Sie diese Escape-Sequenzen in Ihrem Code verwenden "\\+" "\\*" "\\^"

Ändern Sie Ihr Operator-Array wie folgt

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

Weitere Einzelheiten finden Sie unter diesen Links regex.Pattern Und String.split()

  • Das hat nicht funktioniert. Haben Sie andere Ideen, was die Ursache sein könnte?

    – Jarred Parr

    26. Okt. 2016 um 18:57 Uhr

Sie können case String.valueOf(‘+’); verwenden.

  • Die meisten Ihrer Antworten scheinen viele negative Stimmen zu erhalten. Bitte lesen Sie den Abschnitt Wie schreibe ich eine gute Antwort? Lesen Sie den Artikel im Hilfebereich, bevor Sie versuchen, eine Antwort zu posten.

    – Zephyr

    10. Juli 2019 um 20:45 Uhr

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

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

Bearbeiten: Dies funktioniert nur für Standardoperatoren, nicht für x oder X. Sie müssen Ihre ändern String[] operators Erklärung eigentlich, wie die andere erwähnte Antwort. Persönlich würde ich jedoch eine Art Eingabevalidierung durchführen und ein replace() ausführen x oder X sein * stattdessen

Die Methode split() verwendet Regex. Das „+“-Symbol ist ein Sonderzeichen in Regex, daher müssen Sie es mit dem Backslash-Symbol („\“) maskieren. Aber Sie müssen in Java auch das Backslash-Symbol maskieren, also benötigen Sie zwei Backslashes, z. B. „\\+“

1451930cookie-checkjava.util.regex.PatternSyntaxException: Hängendes Metazeichen „+“ in der Nähe von Index 0 +

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy