Я получил StackOverflowError
при сопоставлении результата с использованием шаблона RegEx.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
И 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)
...
Я думаю, что предпросмотр в шаблоне причины этой ошибки, так как есть много поиска, но я не понял, как уменьшить его или обойти.
Я действительно ценю любое предложение, так как я не испытываю в RegEx.
Я действительно знал те случаи, которые мой оригинальный шаблон пропустил, так как я не добавлял эти случаи в тесты. – Genzer
@Genzer: Я предложил правильное регулярное выражение для вас. – nhahtdh
Удивительно, ваше предложение прошло все мои тесты только сейчас, включая тест для 'StackOverflowError'. Я не знал о «притяжательных» вещах. Не могли бы вы предложить любые ссылки RegEx, которые я могу улучшить? – Genzer