In message <[EMAIL PROTECTED]>, "Daniel F. Savarese" 
writes:
>groups that match outside of the full match to be saved?  It's
>actually quite tricky to implement this without either maintaining
>a reference to a copy of the entire original input (undesirable) or
>screwing up a lot of other cases.  I'd like to mull this one over

Here's a patch that fixes the case you reported.  I don't think it
breaks anything else, but I can't be sure.  Any volunteers for those
unit tests we keep talking about?  At any rate, I don't want to apply
the patch until it has been well-tested.

daniel


Index: src/java/org/apache/oro/text/regex/Perl5MatchResult.java
===================================================================
RCS file: 
/home/cvs/jakarta-oro/src/java/org/apache/oro/text/regex/Perl5MatchResult.java,v
retrieving revision 1.4
diff -u -r1.4 Perl5MatchResult.java
--- src/java/org/apache/oro/text/regex/Perl5MatchResult.java    17 May 2001 21:59:33 
-0000      1.4
+++ src/java/org/apache/oro/text/regex/Perl5MatchResult.java    31 May 2002 16:21:15 
+-0000
@@ -125,7 +125,11 @@
    * @return The length of the match.
    */
   public int length(){
-    return _match.length();
+    int length;
+
+    length = (_endGroupOffset[0] - _beginGroupOffset[0]);
+
+    return (length > 0 ? length : 0);
   }
 
 
Index: src/java/org/apache/oro/text/regex/Perl5Matcher.java
===================================================================
RCS file: /home/cvs/jakarta-oro/src/java/org/apache/oro/text/regex/Perl5Matcher.java,v
retrieving revision 1.18
diff -u -r1.18 Perl5Matcher.java
--- src/java/org/apache/oro/text/regex/Perl5Matcher.java        25 Jan 2002 09:32:28 
-0000      1.18
+++ src/java/org/apache/oro/text/regex/Perl5Matcher.java        31 May 2002 16:21:16 
+-0000
@@ -241,7 +241,7 @@
   // Set the match result information.  Only call this if we successfully
   // matched.
   private void __setLastMatchResult() {
-    int offs;
+    int offs, maxEndOffs = 0;
 
     //endOffset+=dontTry;
 
@@ -251,10 +251,6 @@
     if(__endMatchOffsets[0] > __originalInput.length)
       throw new ArrayIndexOutOfBoundsException();
 
-    __lastMatchResult._match =
-      new String(__originalInput, __beginMatchOffsets[0],
-                __endMatchOffsets[0] - __beginMatchOffsets[0]);
-
     __lastMatchResult._matchBeginOffset = __beginMatchOffsets[0];
 
     while(__numParentheses >= 0) {
@@ -269,15 +265,21 @@
 
       offs = __endMatchOffsets[__numParentheses];
 
-      if(offs >= 0)
+      if(offs >= 0) {
        __lastMatchResult._endGroupOffset[__numParentheses] =
          offs - __lastMatchResult._matchBeginOffset;
-      else
+       if(offs > maxEndOffs && offs <= __originalInput.length)
+         maxEndOffs = offs;
+      } else
        __lastMatchResult._endGroupOffset[__numParentheses] =
          OpCode._NULL_OFFSET;
 
       --__numParentheses;
     }
+
+    __lastMatchResult._match =
+      new String(__originalInput, __beginMatchOffsets[0],
+                maxEndOffs - __beginMatchOffsets[0]);
 
     // Free up for garbage collection
     __originalInput = null;

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to