Regex Unbehandelte Ausnahme (error_badrepeate 10)

  • C++

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Fakiz.

    Regex Unbehandelte Ausnahme (error_badrepeate 10)

    Guten Abend,
    ich spiele mich gerade mit Regex. Die Listings aus meinem Buch funktionieren Problemlos, mein eigenes Konstrukt leider nicht.
    Ich versuche gerade eine JSON Datei zu parsen, dass versuche wie folgt.

    C-Quellcode

    1. std::cmatch match;
    2. std::regex expression{ "\"input\":\s*{\s*\"\w{4,}\":\s*\[\s*({.+?},)+\s*]\s*}," };
    3. std::regex_search(json.c_str(), match, expression);


    VS quittiert mir das mit einer Ausnahme, leider kann ich mit dieser rein garnichts anfangen.
    Unbehandelte Ausnahme bei 0x00007FFA69214FD9 in RegexTest.exe: Microsoft C++-Ausnahme: std::regex_error bei Speicherort 0x0000000B4C9ED310.
    regex_constants::error_type: error_badrepeat(10)

    Verwendete Regex Syntax: ECMAScript
    Verwendeter Sprachstandard: C++ 20

    Unter Umständen kann mir jemand auf die Sprünge helfen.
    Ja, das isnumaso.
    Regex kann bei unglücklich gewählten Pattern extrem ineffizient werden - bis hin zum Absturz.
    Was da jetzt bei deim Pattern der/die Bösewicht/e ist/sind kann ich nicht analysieren.

    Jedenfalls Json kann man mit Regex alleine nicht parsen, weil Json ist eine Baumstruktur, und da kommt Regex nicht mit (weil es "ist nur eine Grammatik der zweiten Ordnung" (hat mal einer verlauten lassen, der sich mit Grammatiken auskanntete))
    Konnte den Fehler entzwichen finden, unter regex_constants namespace gibt es zu den ganze Regex-Fehlern die Fehlerbeschreibungen. Auch sehr zu empfehlen ist Regular Expression C++.

    Zu meinem Fehler lautet die Fehlerbeschreibung: a repeat expression (one of '*', '', '+', '{' in most contexts) was not preceded by an expression
    Mit anderen Worten { muss mit einem \\ escaped werden. Damit aber nicht genug um nen funktionierenden Pattern zu bekommen müssen alle Zeichen mit spezieller Bedeutung ebenfalls escaped werden.

    Ich hab mal mit Absicht eine Warnung provoziert in dem Tooltip, den VS anzeigt, sieht man den Pattern.
    Bilder
    • regex.png

      7,45 kB, 524×116, 47 mal angesehen
    Die geschweiften Klammern sind für Quantifier. Und klar, Regex-Symbole müssen escaped werden damit sie als Literal genutzt werden können. Ganz davon abgesehen, Regex hat beim Hantieren mit JSON überhaupt nix zu suchen, vergiss das, damit bist du komplett auf dem falschen Weg. JSON, XML oder HTML sind, wie EDR auch oben schon gesagt hat, Baumstrukturen, die (rein theoretisch) unendlich tief sein können. Regex kann es nicht leisten, solche Strukturen zu analysieren. Dafür braucht man Parser. Zum Glück gibt es die schon. Also Schluss mit dem wilden Regex-Gematsche. Regex ist richtig geiles Zeug, aber man muss auch wissen, wann man Regex nicht benutzt ;)
    Hello World
    Da hab ich mich wohl unglücklich ausgedrückt, mir ging's nicht um JSON sondern um Regex und das einlesen von Dateien. Das ganze war nur eine Übung. Selbstverständlich sollte man das Rad nicht neu erfinden, wenn es bereits ein anderer erfunden hat.