Я получил StackOverflowError
при сопоставлении результата с использованием шаблона RegEx.
Шаблон (\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.