You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by "Vladimir Ivanov (JIRA)" <ji...@apache.org> on 2006/08/11 07:14:15 UTC

[jira] Created: (HARMONY-1149) [classlib][util] unexpected PatternSyntaxException for String.replaceFirst()/replaceAll()

[classlib][util] unexpected PatternSyntaxException for String.replaceFirst()/replaceAll()
-----------------------------------------------------------------------------------------

                 Key: HARMONY-1149
                 URL: http://issues.apache.org/jira/browse/HARMONY-1149
             Project: Harmony
          Issue Type: Bug
          Components: Classlib
            Reporter: Vladimir Ivanov


The Harmony methods String.replaceFirst(String regex, String replacement) and String.replaceAll(String regex, String replacement) throws PatternSyntaxException on Harmony and works silently on RI.

=================== test.java ======================
import java.util.regex.*;

public class test  {    

    public static void main (String [] args) {
        String str_re = "\\1";
        try {
            System.out.println("replaceFirst = " + "abc".replaceFirst(str_re, "x"));
        } catch (Exception e) {
            System.out.println("unexpected exception: " + e);
        }
        try {
            System.out.println("replaceAll = " + "abc".replaceAll(str_re, "x"));
        } catch (Exception e) {
            System.out.println("unexpected exception: " + e);
            e.printStackTrace();
       }
    }
}
================================================

Output:
C:\tmp\tmp17>C:\jrockit-jdk1.5.0-windows-ia32\bin\java.exe -cp . -showversion test
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-b64)
BEA WebLogic JRockit(R) (build dra-38972-20041208-2001-win-ia32, R25.0.0-75, GC: System optimized over throughput (initial strategy singleparpar))

replaceFirst = abc
replaceAll = abc

C:\tmp\tmp17>C:\harmony\classlib1.5\deploy\jdk\jre\bin\java.exe -cp . -showversion test
java version 1.5 (subset)

(c) Copyright 1991, 2006 The Apache Software Foundation or its licensors, as applicable.
unexpected exception: java.util.regex.PatternSyntaxException: No such group yet exists at this point in the pattern near index: 0
\1
^
unexpected exception: java.util.regex.PatternSyntaxException: No such group yet exists at this point in the pattern near index: 0
\1
^
java.util.regex.PatternSyntaxException: No such group yet exists at this point in the pattern near index: 0
\1
^
        at java.util.regex.Pattern.processTerminal(Pattern.java:950)
        at java.util.regex.Pattern.processSubExpression(Pattern.java:593)
        at java.util.regex.Pattern.processExpression(Pattern.java:376)
        at java.util.regex.Pattern.compileImpl(Pattern.java:279)
        at java.util.regex.Pattern.compile(Pattern.java:261)
        at java.util.regex.Pattern.compile(Pattern.java:1155)
        at java.lang.String.replaceAll(String.java:1782)
        at test.main(test.java:13)


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

[jira] Updated: (HARMONY-1149) [classlib][util] unexpected PatternSyntaxException for String.replaceFirst()/replaceAll()

Posted by "Vladimir Ivanov (JIRA)" <ji...@apache.org>.
     [ http://issues.apache.org/jira/browse/HARMONY-1149?page=all ]

Vladimir Ivanov updated HARMONY-1149:
-------------------------------------

    Attachment: StringTest.patch

unit test

> [classlib][util] unexpected PatternSyntaxException for String.replaceFirst()/replaceAll()
> -----------------------------------------------------------------------------------------
>
>                 Key: HARMONY-1149
>                 URL: http://issues.apache.org/jira/browse/HARMONY-1149
>             Project: Harmony
>          Issue Type: Bug
>          Components: Classlib
>            Reporter: Vladimir Ivanov
>         Attachments: StringTest.patch
>
>
> The Harmony methods String.replaceFirst(String regex, String replacement) and String.replaceAll(String regex, String replacement) throws PatternSyntaxException on Harmony and works silently on RI.
> =================== test.java ======================
> import java.util.regex.*;
> public class test  {    
>     public static void main (String [] args) {
>         String str_re = "\\1";
>         try {
>             System.out.println("replaceFirst = " + "abc".replaceFirst(str_re, "x"));
>         } catch (Exception e) {
>             System.out.println("unexpected exception: " + e);
>         }
>         try {
>             System.out.println("replaceAll = " + "abc".replaceAll(str_re, "x"));
>         } catch (Exception e) {
>             System.out.println("unexpected exception: " + e);
>             e.printStackTrace();
>        }
>     }
> }
> ================================================
> Output:
> C:\tmp\tmp17>C:\jrockit-jdk1.5.0-windows-ia32\bin\java.exe -cp . -showversion test
> java version "1.5.0"
> Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-b64)
> BEA WebLogic JRockit(R) (build dra-38972-20041208-2001-win-ia32, R25.0.0-75, GC: System optimized over throughput (initial strategy singleparpar))
> replaceFirst = abc
> replaceAll = abc
> C:\tmp\tmp17>C:\harmony\classlib1.5\deploy\jdk\jre\bin\java.exe -cp . -showversion test
> java version 1.5 (subset)
> (c) Copyright 1991, 2006 The Apache Software Foundation or its licensors, as applicable.
> unexpected exception: java.util.regex.PatternSyntaxException: No such group yet exists at this point in the pattern near index: 0
> \1
> ^
> unexpected exception: java.util.regex.PatternSyntaxException: No such group yet exists at this point in the pattern near index: 0
> \1
> ^
> java.util.regex.PatternSyntaxException: No such group yet exists at this point in the pattern near index: 0
> \1
> ^
>         at java.util.regex.Pattern.processTerminal(Pattern.java:950)
>         at java.util.regex.Pattern.processSubExpression(Pattern.java:593)
>         at java.util.regex.Pattern.processExpression(Pattern.java:376)
>         at java.util.regex.Pattern.compileImpl(Pattern.java:279)
>         at java.util.regex.Pattern.compile(Pattern.java:261)
>         at java.util.regex.Pattern.compile(Pattern.java:1155)
>         at java.lang.String.replaceAll(String.java:1782)
>         at test.main(test.java:13)

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

[jira] Commented: (HARMONY-1149) [classlib][util] unexpected PatternSyntaxException for String.replaceFirst()/replaceAll()

Posted by "Anton Ivanov (JIRA)" <ji...@apache.org>.
    [ http://issues.apache.org/jira/browse/HARMONY-1149?page=comments#action_12427473 ] 
            
Anton Ivanov commented on HARMONY-1149:
---------------------------------------

As you can see the problem arose while compiling regular expression "\\1" in the Pattern class.
1. To minimize the example you can write:

import java.util.regex.*; 

public class test { 

    public static void main (String [] args) { 
        String str_re = "\\1"; 

        try { 
            Pattern.compile(str_re); 
        } catch (Exception e) { 
            System.out.println("unexpected exception: " + e); 
        } 
    } 
} 

2. As it is written in the API documentation for Pattern class "...сapturing groups are numbered by counting their opening parentheses from left to right..." and "...capturing groups are so named because, during a match, each subsequence of the input sequence that matches such a group is saved. The captured subsequence may be used later in the expression, via a back reference, and may also be retrieved from the matcher once the match operation is complete..." In the pattern "\\1" we have no yet group number 1 while compiling it, so backreference to the first group \1 is invalid.
So we throw an exception.
You can try to compile "\\2" string on RI and you will see the same situaution as for "\\1" on Harmony.

3. Another question is what  backreference \1 should match while no such group in the pattern yet exists?
For example if you write following on RI 
        
        Pattern pat = Pattern.compile("\\1(c)");
        Matcher mat = pat.matcher("cc");
        if (mat.matches()) {
        	System.out.println("matches");
        } else {
        	System.out.println("not matches");
        }

There will be the output "not matches"
But if you change the first string to

Pattern pat = Pattern.compile("(c)\\1");

Then the output will be "matches".
So backrefences to groups that do not yet exist are not processed as it may be expected.
And again 

Pattern.compile("\\2(a)(b)"); 

will cause an exception.


I beleave this is a RI bug, not Harmony.  

> [classlib][util] unexpected PatternSyntaxException for String.replaceFirst()/replaceAll()
> -----------------------------------------------------------------------------------------
>
>                 Key: HARMONY-1149
>                 URL: http://issues.apache.org/jira/browse/HARMONY-1149
>             Project: Harmony
>          Issue Type: Bug
>          Components: Classlib
>            Reporter: Vladimir Ivanov
>         Attachments: StringTest.patch
>
>
> The Harmony methods String.replaceFirst(String regex, String replacement) and String.replaceAll(String regex, String replacement) throws PatternSyntaxException on Harmony and works silently on RI.
> =================== test.java ======================
> import java.util.regex.*;
> public class test  {    
>     public static void main (String [] args) {
>         String str_re = "\\1";
>         try {
>             System.out.println("replaceFirst = " + "abc".replaceFirst(str_re, "x"));
>         } catch (Exception e) {
>             System.out.println("unexpected exception: " + e);
>         }
>         try {
>             System.out.println("replaceAll = " + "abc".replaceAll(str_re, "x"));
>         } catch (Exception e) {
>             System.out.println("unexpected exception: " + e);
>             e.printStackTrace();
>        }
>     }
> }
> ================================================
> Output:
> C:\tmp\tmp17>C:\jrockit-jdk1.5.0-windows-ia32\bin\java.exe -cp . -showversion test
> java version "1.5.0"
> Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-b64)
> BEA WebLogic JRockit(R) (build dra-38972-20041208-2001-win-ia32, R25.0.0-75, GC: System optimized over throughput (initial strategy singleparpar))
> replaceFirst = abc
> replaceAll = abc
> C:\tmp\tmp17>C:\harmony\classlib1.5\deploy\jdk\jre\bin\java.exe -cp . -showversion test
> java version 1.5 (subset)
> (c) Copyright 1991, 2006 The Apache Software Foundation or its licensors, as applicable.
> unexpected exception: java.util.regex.PatternSyntaxException: No such group yet exists at this point in the pattern near index: 0
> \1
> ^
> unexpected exception: java.util.regex.PatternSyntaxException: No such group yet exists at this point in the pattern near index: 0
> \1
> ^
> java.util.regex.PatternSyntaxException: No such group yet exists at this point in the pattern near index: 0
> \1
> ^
>         at java.util.regex.Pattern.processTerminal(Pattern.java:950)
>         at java.util.regex.Pattern.processSubExpression(Pattern.java:593)
>         at java.util.regex.Pattern.processExpression(Pattern.java:376)
>         at java.util.regex.Pattern.compileImpl(Pattern.java:279)
>         at java.util.regex.Pattern.compile(Pattern.java:261)
>         at java.util.regex.Pattern.compile(Pattern.java:1155)
>         at java.lang.String.replaceAll(String.java:1782)
>         at test.main(test.java:13)

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira