当使用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