Duplicate :
|
|
Relates :
|
|
Relates :
|
FULL PRODUCT VERSION : java version "1.5.0_05" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_05-b05) Java HotSpot(TM) Client VM (build 1.5.0_05-b05, mixed mode, sharing) ADDITIONAL OS VERSION INFORMATION : Microsoft Windows 2000 [Version 5.00.2195] A DESCRIPTION OF THE PROBLEM : any pattern like (x|y)* (an alternative wrapped in a star) is implemented recursively by Pattern. Each matched alternative uses about 5 method calls on the stack. This makes that kind of pattern useless on any reasonably-sized input. Is there any chance you can make the Pattern implementation non-recursive in this case? STEPS TO FOLLOW TO REPRODUCE THE PROBLEM : see example code EXPECTED VERSUS ACTUAL BEHAVIOR : EXPECTED - matched? true ACTUAL - java.lang.StackOverflowError ERROR MESSAGES/STACK TRACES THAT OCCUR : java.lang.StackOverflowError at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) at java.util.regex.Pattern$Single.match(Pattern.java:3004) at java.util.regex.Pattern$Branch.match(Pattern.java:3933) at java.util.regex.Pattern$GroupHead.match(Pattern.java:3973) at java.util.regex.Pattern$Loop.match(Pattern.java:4100) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4032) Exception in thread "main" REPRODUCIBILITY : This bug can be reproduced always. ---------- BEGIN SOURCE ---------- import java.util.regex.Pattern; import java.util.regex.Matcher; public class RegexpFun { public static void main(String[] args) { CharSequence largeString = makeLargeString(); Pattern p = Pattern.compile("(x|y)*"); Matcher m = p.matcher(largeString); System.out.println("matches? " + m.matches()); // throws StackOverflowError } private static CharSequence makeLargeString() { final int size = 1000; StringBuffer largeString = new StringBuffer(size); for (int i = 0; i < size/2; i++) { largeString.append("xy"); } return largeString; } } ---------- END SOURCE ---------- CUSTOMER SUBMITTED WORKAROUND : no workaround
|