2012-10-11 10 views
11

Ich möchte verschachtelte JSON-Strings parsen, indem ich sie rekursiv durch {} aufteile. Die Regex, die ich mir ausgedacht habe, ist "{([^}] *.?)}", Die ich tested passend die Zeichenfolge habe, die ich will. Jedoch, wenn ich versuche, es in meinem Java aufzunehmen, erhalte ich den folgenden Fehler: "Ungültige Escape-Sequenz (gültige sind \ b \ t \ n \ f \ r \" \ '\) "Java-Regex, um geschweifte Klammern abzustimmen - "ungültige Escape-Sequenz"

Dies ist mein Code und wo der Fehler auftritt:

String[] strArr = jsonText.split("\{([^}]*.?)\}"); 

Was mache ich falsch

+1

nicht übereinstimmen Escape die geschweiften Klammern ... – assylias

+1

Verwenden Sie doppelte Schrägstriche, um Backslash für Java selbst zuerst zu entkommen. Als nächstes müssen Sie nicht geschweifte Klammern entkommen. –

+2

BTW, es gibt gute Bibliotheken im Web, um JSON für Java zu parsen. –

Antwort

10

1. Curle geschweifte Klammern haben keine besondere Bedeutung hier für Regexp-Sprache, so dass sie nicht entkommen sollten, denke ich.

  1. Wenn Sie ihnen entkommen wollen, können Sie. Backslash ist ein Escape-Symbol für regexp, aber es sollte auch für Java selbst mit einem zweiten Backslash maskiert werden.

  2. Warum entkommen Sie nicht Curle Brace innerhalb Gruppierung Konstrukt?

  3. Es gibt gute JSON Parsen Bibliotheken https://stackoverflow.com/questions/338586/a-better-java-json-library

  4. Sie verwenden nur ungern quantifier, so dass es nicht mit verschachtelten Klammern arbeiten, zum Beispiel für {"a", {"b", "c"}, "d"} wird es {"a", {"b", "c"}

+0

+ 1hmm..'regex' für alles ist nicht gut! – Anirudha

+2

Nur eine kleine Bemerkung: geschweifte Klammern haben tatsächlich eine besondere Bedeutung für die Regex-Engine (z. B. A {1,2} für A und AA).Unescaped können sie seltsame Fehler verursachen, während 'Pattern.compile (...)'. – Oroboros102

+1

** geschweifte Klammern haben Bedeutung in regulären Ausdrücken **, sie können verwendet werden, um zu sagen ** wie oft eine Wiederholung auftreten kann **. z.B. [A-Z] {1,4} bedeutet, dass Großbuchstaben zwischen 1 und 4 vorkommen. –

1

Sie benötigen Backslash mit einem weiteren Backslash zu entkommen Da \{ ist keine gültige Escape-Sequenz: -?.

String[] strArr = jsonText.split("\\{([^\\}]*.?)\\}"); 

Weitere Informationen zu Escape-Sequenzen finden Sie unter Pattern documentation.

8

Das Schreckliche an Java Regexes ist, dass Java eine Regex nicht als Regex erkennt.
Es akzeptiert nur \\, \', \" oder \u[hexadecimal number] als gültige Escape-Sequenzen. Sie müssen daher die Backslashes umgehen, da \{ offensichtlich eine ungültige Escape-Sequenz ist.
Korrigierte Version:

String[] strArr = jsonText.split("\\{([^}]*.?)\\}"); 
1

Verdoppeln Sie die Schrägstriche:

String[] strArr = jsonText.split("\\{([^}]*.?)\\}"); 
1

Der reguläre Ausdruck sein sollte

"\\{([^}]*?)\\}" 

. nicht erforderlich!

Verwandte Themen