StackOverflowError
RegExパターンを使用して結果を照合したときに得られました。
パターンは(\d\*?(;(?=\d))?)+
です。この正規表現は、入力を検証するために使用されます。
12345;4342;234*;123*;344324
入力は、で区切られた値(数字のみ)で構成される文字列;
です。各値には*
、最後に1つ含めることができます(他の一致のワイルドカードとして使用されます)。;
文字列の最後にはありません。
問題は、この正規表現が正常に機能し、値の数が少ないことです。ただし、値の数が多すぎる(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)
...
ルックアップがたくさんあるので、パターンの先読みがこのエラーの原因になると思いますが、それを減らす方法や回避する方法がわかりません。
私は正規表現の経験がないので、どんな提案にも本当に感謝しています。