當使用RegEx模式匹配結果時,我得到StackOverflowError
。使用RegEx匹配大輸入時出現StackOverflowError
該模式是(\d\*?(;(?=\d))?)+
。此正則表達式是用來驗證輸入:
12345;4342;234*;123*;344324
輸入是一個字符串由通過;
分隔值(僅位)。每個值最後可以包含一個*
(用作其他匹配的通配符)。字符串的末尾沒有;
。
問題是,這個正則表達式工作正常,其中少數值。但是,如果數值太大(超過300),則會導致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
而且堆棧跟蹤:
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)
...
我想先行的格局造成這個錯誤,因爲有很多的查找,但我還沒有想出如何降低它或解決。
我真的很感激任何建議,因爲我沒有RegEx的經驗。
我確實知道那些我原來的模式遺漏的案例,因爲我沒有在測試中添加這些案例。 – Genzer 2013-02-26 10:43:51
@Genzer:我的確給你推薦了一個正確的正則表達式。 – nhahtdh 2013-02-26 10:45:27
令人驚訝的是,您的建議剛剛通過了我所有的測試,包括'StackOverflowError'的測試。我不知道「佔有」的東西。你能否建議我可以改進的任何RegEx參考? – Genzer 2013-02-26 10:45:28