You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@harmony.apache.org by "Udovichenko, Nellya" <ne...@intel.com> on 2007/03/14 11:25:48 UTC

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

Hi, 
Can we close this JIRA as 'non-bug difference, won't fix'?
 
I agree with Anton the issue is RI bug. In JDK 1.5 it allows one reference more than expected. May be the initial groups number is 1 instead 0. Therefore it doesn't correctly execute check-up of the back reference '\1' at regular expression parsing. 

Regards,
Nellya. 
 
 
>From "Anton Ivanov (JIRA)" <j....@apache.org> 
Subject [jira] Commented: (HARMONY-1149) [classlib][util] unexpected PatternSyntaxException for String.replaceFirst()/replaceAll() 
Date Fri, 11 Aug 2006 08:50:14 GMT 
    [ http://issues.apache.org/jira/browse/HARMONY-1149?page=comments#action_12427473 <http://issues.apache.org/jira/browse/HARMONY-1149?page=comments%23action_12427473%20>  ] 
 
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


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

Posted by "Udovichenko, Nellya" <ne...@intel.com>.
Alexei, thank you very much!

Regards,
Nellya.

-----Original Message-----
From: Alexei Zakharov [mailto:alexei.zakharov@gmail.com] 
Sent: Tuesday, March 20, 2007 4:52 PM
To: dev@harmony.apache.org
Subject: Re: [jira] Commented: (HARMONY-1149) [classlib][regex] unexpected PatternSyntaxException for String.replaceFirst()/replaceAll()

Personally I agree to move this JIRA to Non-buf differences from RI.
So since there were no other voices I'm closing it.

Thanks,

2007/3/14, Udovichenko, Nellya <ne...@intel.com>:
> Hi,
> Can we close this JIRA as 'non-bug difference, won't fix'?
>
> I agree with Anton the issue is RI bug. In JDK 1.5 it allows one reference more than expected. May be the initial groups number is 1 instead 0. Therefore it doesn't correctly execute check-up of the back reference '\1' at regular expression parsing.
>
> Regards,
> Nellya.
>
>
> From "Anton Ivanov (JIRA)" <j....@apache.org>
> Subject [jira] Commented: (HARMONY-1149) [classlib][util] unexpected PatternSyntaxException for String.replaceFirst()/replaceAll()
> Date Fri, 11 Aug 2006 08:50:14 GMT
>     [ http://issues.apache.org/jira/browse/HARMONY-1149?page=comments#action_12427473 <http://issues.apache.org/jira/browse/HARMONY-1149?page=comments%23action_12427473%20>  ]
>
> 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


-- 
Alexei Zakharov,
Intel ESSD

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

Posted by Alexei Zakharov <al...@gmail.com>.
Personally I agree to move this JIRA to Non-buf differences from RI.
So since there were no other voices I'm closing it.

Thanks,

2007/3/14, Udovichenko, Nellya <ne...@intel.com>:
> Hi,
> Can we close this JIRA as 'non-bug difference, won't fix'?
>
> I agree with Anton the issue is RI bug. In JDK 1.5 it allows one reference more than expected. May be the initial groups number is 1 instead 0. Therefore it doesn't correctly execute check-up of the back reference '\1' at regular expression parsing.
>
> Regards,
> Nellya.
>
>
> From "Anton Ivanov (JIRA)" <j....@apache.org>
> Subject [jira] Commented: (HARMONY-1149) [classlib][util] unexpected PatternSyntaxException for String.replaceFirst()/replaceAll()
> Date Fri, 11 Aug 2006 08:50:14 GMT
>     [ http://issues.apache.org/jira/browse/HARMONY-1149?page=comments#action_12427473 <http://issues.apache.org/jira/browse/HARMONY-1149?page=comments%23action_12427473%20>  ]
>
> 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


-- 
Alexei Zakharov,
Intel ESSD