StackOverflowError wenn passende große Eingabe mit RegEx

Bekam ich StackOverflowError beim Abgleich das Ergebnis mit einem RegEx pattern.

Das Muster ist (\d\*?(;(?=\d))?)+. Diese regex wird verwendet, um überprüfen die Eingabe:

12345;4342;234*;123*;344324

Die Eingabe aus einem string besteht, der die Werte (nur Ziffern), getrennt durch ;. Jeder Wert könnte auch der eine * am Ende (als Platzhalter für andere "matching"). Es gibt keine ; am Ende der Zeichenfolge.

Das problem ist, dass dieser regex funktioniert einwandfrei, die kleine Anzahl der Werte. Aber wenn die Zahl der Werte ist zu groß (über 300), wird es zu StackOverflowError.

final String TEST_REGEX = "(\\d\\*?(;(?=\\d))?)+";

//Generate string
StringBuilder builder = new StringBuilder();
int number = 123456;
for (int count = 1; count <= 300; count++) {
    builder.append(Integer.toString(number).concat(";"));
    number++;
}
builder.deleteCharAt(builder.lastIndexOf(";"))

builder.toString().matches(TEST_REGEX); //<---------- StackOverflowError

Und den stacktrace:

java.lang.StackOverflowError
    at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3715)
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556)
    at java.util.regex.Pattern$Loop.match(Pattern.java:4683)
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4615)
    at java.util.regex.Pattern$Ques.match(Pattern.java:4079)
    at java.util.regex.Pattern$Ques.match(Pattern.java:4079)
    at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3715)
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556)
    at java.util.regex.Pattern$Loop.match(Pattern.java:4683)
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4615)
    at java.util.regex.Pattern$Ques.match(Pattern.java:4079)
    at java.util.regex.Pattern$Ques.match(Pattern.java:4079)
    at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3715)
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556)
    at java.util.regex.Pattern$Loop.match(Pattern.java:4683)
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4615)
    ...

Ich denke, dass die lookahead-Funktion, die in das Muster zu diesem Fehler führen, da es viele lookup-aber ich habe nicht herausgefunden, wie es zu reduzieren oder zu umgehen.

Ich bin wirklich dankbar für jede Anregung da ich keine Erfahrung mit RegEx.

InformationsquelleAutor Genzer | 2013-02-26
Schreibe einen Kommentar