java.lang.StackOverflowError, während eine RegEx zu Parsen großen strings
Dies ist mein Regex
((?:(?:'[^']*')|[^;])*)[;]
Es tokenizes ein string am Semikolon. Zum Beispiel,
Hello world; I am having a problem; using regex;
Ergebnis ist drei Saiten
Hello world
I am having a problem
using regex
Aber wenn ich mit einem großen Eingabe-string bekomme ich diesen Fehler
Exception in thread "main" java.lang.StackOverflowError
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$BranchConn.match(Pattern.java:4078)
at java.util.regex.Pattern$CharProperty.match(Pattern.java:3345)
at java.util.regex.Pattern$Branch.match(Pattern.java:4114)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
Wie ist das verursacht und wie kann ich es lösen?
Wie groß ist die Zeichenfolge, die Sie analysieren?
InformationsquelleAutor Ali | 2011-09-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider, Java vordefinierte regex-support hat Probleme mit regexes mit sich wiederholenden alternative Pfade (
(A|B)*
). Dies ist zusammengestellt in einer rekursiven Aufruf, die Ergebnisse in einer StackOverflow-Fehler bei Einsatz auf einem sehr großen string.Eine mögliche Lösung ist, schreiben Sie Ihre regex, nicht mit einem repetitiven alternative, aber wenn Ihr Ziel ist es, für die tokenisierung, die eine Zeichenfolge auf Semikolons, brauchen Sie nicht eine komplexe regex überhaupt richtig, benutzen Sie einfach String.split() mit einem einfachen
";"
als argument.Ich denke, dass ich nicht mein Fall, klar, tut mir Leid. String wird nicht in Token aufgeteilt, nur auf Semikolon, aber es wird in Token aufgeteilt auf viele Muster zur gleichen Zeit, tokenisierung auf Semikolon war nur ein einfacher Fall.
naja, allgemein gesagt: versuchen zu vermeiden, alternativen in eine wildcard. Sie könnten auch geben alternative regex-Bibliotheken wie jregex zu gehen, obwohl ich nicht sicher bin, dass würde das Problem lösen...
Für weitere Referenz bugs.sun.com/bugdatabase/view_bug.do?bug_id=6337993
InformationsquelleAutor Jeen Broekstra
Wenn Sie wirklich brauchen, um einen regex verwenden, die overflows Ihren stack, können Sie erhöhen Sie die Größe Ihres Stacks durch die übergabe etwas wie -Xss40m der JVM.
InformationsquelleAutor Andrew
Könnte es helfen, fügen Sie ein
+
nach der[^;]
, so dass Sie weniger Wiederholungen.Gibt es nicht auch etwas konstruieren, der sagt: "wenn der reguläre Ausdruck matched bis zu diesem Punkt, nicht backtrace"? Vielleicht, die in handliches kommt, auch. (Update: es heißt possessive Quantoren).
Eine ganz andere alternative ist das schreiben einer utility-Methode genannt
splitQuoted(char quote, char separator, CharSequence s)
explizit durchläuft den string und merkt sich, ob Sie es gesehen hat, der eine ungerade Anzahl von Anführungszeichen. In dieser Methode könnte man auch den Fall behandeln, dass die Anführungszeichen könnte werden müssen, ohne Umschreibung, wenn es angezeigt wird, in eine Zeichenfolge in Anführungszeichen ein.InformationsquelleAutor Roland Illig