Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8140638

regex pattern compilation fails for patterns containing \Q and \E

XMLWordPrintable

    • 8
    • generic
    • generic

      FULL PRODUCT VERSION :
      java version "1.8.0_40"
      Java(TM) SE Runtime Environment (build 1.8.0_40-b26)
      Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)

      ADDITIONAL OS VERSION INFORMATION :
      Linux mag.ca.com 2.6.32-504.23.4.el6.x86_64 #1 SMP Fri May 29 10:16:43 EDT 2015 x86_64 x86_64 x86_64 GNU/Linux

      A DESCRIPTION OF THE PROBLEM :
      The following code fails on JDK 8 but works fine on JDK 7

      Pattern p = Pattern.compile("^(.{\\Q8\\E})");

      On JDK 8, the regex compilation fails with the following stack trace:

      Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition near index 2
      ^(.{\Q8\E})
        ^
      at java.util.regex.Pattern.error(Pattern.java:1955)
      at java.util.regex.Pattern.closure(Pattern.java:3157)
      at java.util.regex.Pattern.sequence(Pattern.java:2134)
      at java.util.regex.Pattern.expr(Pattern.java:1996)
      at java.util.regex.Pattern.group0(Pattern.java:2905)
      at java.util.regex.Pattern.sequence(Pattern.java:2051)
      at java.util.regex.Pattern.expr(Pattern.java:1996)
      at java.util.regex.Pattern.compile(Pattern.java:1696)
      at java.util.regex.Pattern.<init>(Pattern.java:1351)
      at java.util.regex.Pattern.compile(Pattern.java:1028)
      at com.ca.samples.esales.TestJava.main(TestJava.java:11)

      REGRESSION. Last worked in version 7u80

      ADDITIONAL REGRESSION INFORMATION:
      This issue is not seen in JDK 7.

      I tried both Oracle and OpenJDK and see the issue in both distributions.


      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Compile and Run the following program in JRE 8 -

      public class TestJava {

      public static void main(String[] args) {
      // TODO Auto-generated method stub


      Pattern p = Pattern.compile("^(.{\\Q8\\E})");
      System.out.println(p.toString());

      }

      }

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      The program must print the compiled regex pattern.
      ACTUAL -
      On JDK 8, the regex compilation fails with the following stack trace:

      Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition near index 2
      ^(.{\Q8\E})
        ^
      at java.util.regex.Pattern.error(Pattern.java:1955)
      at java.util.regex.Pattern.closure(Pattern.java:3157)
      at java.util.regex.Pattern.sequence(Pattern.java:2134)
      at java.util.regex.Pattern.expr(Pattern.java:1996)
      at java.util.regex.Pattern.group0(Pattern.java:2905)
      at java.util.regex.Pattern.sequence(Pattern.java:2051)
      at java.util.regex.Pattern.expr(Pattern.java:1996)
      at java.util.regex.Pattern.compile(Pattern.java:1696)
      at java.util.regex.Pattern.<init>(Pattern.java:1351)
      at java.util.regex.Pattern.compile(Pattern.java:1028)
      at com.ca.samples.esales.TestJava.main(TestJava.java:11)

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      On JDK 8, the regex compilation fails with the following stack trace:

      Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition near index 2
      ^(.{\Q8\E})
        ^
      at java.util.regex.Pattern.error(Pattern.java:1955)
      at java.util.regex.Pattern.closure(Pattern.java:3157)
      at java.util.regex.Pattern.sequence(Pattern.java:2134)
      at java.util.regex.Pattern.expr(Pattern.java:1996)
      at java.util.regex.Pattern.group0(Pattern.java:2905)
      at java.util.regex.Pattern.sequence(Pattern.java:2051)
      at java.util.regex.Pattern.expr(Pattern.java:1996)
      at java.util.regex.Pattern.compile(Pattern.java:1696)
      at java.util.regex.Pattern.<init>(Pattern.java:1351)
      at java.util.regex.Pattern.compile(Pattern.java:1028)
      at com.ca.samples.esales.TestJava.main(TestJava.java:11)

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      import java.util.regex.Pattern;

      public class TestJava {

      public static void main(String[] args) {
      // TODO Auto-generated method stub


      Pattern p = Pattern.compile("^(.{\\Q8\\E})");
      System.out.println(p.toString());

      }

      }
      ---------- END SOURCE ----------

            sherman Xueming Shen
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: