addressbuilder/src/main/java/org/ocpsoft/urlbuilder/util/ParseTools.java
public static CapturingGroup balancedCapture(final CharSequence path, final int startPos, final int endPos,
            final CaptureType type)
   {
      Assert.notNull(path, "Character input array must not be null.");
      Assert.assertTrue(startPos >= 0, "Start position must be greater than zero.");
      Assert.assertTrue(startPos < (path.length() - 1),
               "Start position must be at least one character before the array upper bound.");
      Assert.assertTrue(endPos > 0, "End position must be greater than zero.");
      Assert.assertTrue(endPos < path.length(), "End position must be less than or equal to the array upper bound.");
      Assert.assertTrue(startPos < endPos, "Start position must be less than end position.");

      Assert.assertTrue(path.charAt(startPos) == type.getBegin(),
               "Character at starting position was [" + path.charAt(startPos)
                        + "] but expected [" + type.getBegin() + "]");

      if ((startPos > 0) && (path.charAt(startPos - 1) == ESCAPE_CHAR))
      {
         if ((startPos == 1) || ((startPos > 1) && (path.charAt(startPos - 2) != ESCAPE_CHAR)))
         {
            throw new IllegalArgumentException(
                     "Character at starting position is escaped, and cannot be used in capturing a group.");
         }
      }

      int depth = 1;

      char begin = type.getBegin();
      char term = type.getEnd();

      int cursor = startPos + 1;
      while ((cursor < endPos) && (depth > 0))
      {
         if (path.charAt(cursor) == term)
         {
            if (!isEscaped(path, cursor))
               depth--;
         }
         else if (path.charAt(cursor) == begin)
         {
            if (!isEscaped(path, cursor))
               depth++;
         }

         if (depth == 0)
         {
            break;
         }
         cursor++;
      }

      return new CapturingGroup(path, startPos, cursor);
   }
public static CapturingGroup balancedCapture(final CharSequence path, final int startPos, final int endPos,
            final CaptureType type)
   {
      Assert.notNull(path, "Character input array must not be null.");
      Assert.assertTrue(startPos >= 0, "Start position must be greater than zero.");
      Assert.assertTrue(startPos < (path.length() - 1),
               "Start position must be at least one character before the array upper bound.");
      Assert.assertTrue(endPos > 0, "End position must be greater than zero.");
      Assert.assertTrue(endPos < path.length(), "End position must be less than or equal to the array upper bound.");
      Assert.assertTrue(startPos < endPos, "Start position must be less than end position.");

      Assert.assertTrue(path.charAt(startPos) == type.getBegin(),
               "Character at starting position was [" + path.charAt(startPos)
                        + "] but expected [" + type.getBegin() + "]");

      if ((startPos > 0) && (path.charAt(startPos - 1) == ESCAPE_CHAR))
      {
         if ((startPos == 1) || ((startPos > 1) && (path.charAt(startPos - 2) != ESCAPE_CHAR)))
         {
            throw new IllegalArgumentException(
                     "Character at starting position is escaped, and cannot be used in capturing a group.");
         }
      }

      int depth = 1;

      char begin = type.getBegin();
      char term = type.getEnd();

      int cursor = startPos + 1;
      while ((cursor < endPos) && (depth > 0))
      {
         if (path.charAt(cursor) == term)
         {
            if (!isEscaped(path, cursor))
               depth--;
         }
         else if (path.charAt(cursor) == begin)
         {
            if (!isEscaped(path, cursor))
               depth++;
         }

         if (depth == 0)
         {
            break;
         }
         cursor++;
      }

      return new CapturingGroup(path, startPos, cursor);
   }
public static CapturingGroup balancedCapture ( final CharSequence path , final int startPos , final int endPos , final CaptureType type ) { Assert . notNull ( path , "Character input array must not be null." ) ; Assert . assertTrue ( startPos >= 0 , "Start position must be greater than zero." ) ; Assert . assertTrue ( startPos < ( path . length ( ) - 1 ) , "Start position must be at least one character before the array upper bound." ) ; Assert . assertTrue ( endPos > 0 , "End position must be greater than zero." ) ; Assert . assertTrue ( endPos < path . length ( ) , "End position must be less than or equal to the array upper bound." ) ; Assert . assertTrue ( startPos < endPos , "Start position must be less than end position." ) ; Assert . assertTrue ( path . charAt ( startPos ) == type . getBegin ( ) , "Character at starting position was [" + path . charAt ( startPos ) + "] but expected [" + type . getBegin ( ) + "]" ) ; if ( ( startPos > 0 ) && ( path . charAt ( startPos - 1 ) == ESCAPE_CHAR ) ) { if ( ( startPos == 1 ) || ( ( startPos > 1 ) && ( path . charAt ( startPos - 2 ) != ESCAPE_CHAR ) ) ) { throw new IllegalArgumentException ( "Character at starting position is escaped, and cannot be used in capturing a group." ) ; } } int depth = 1 ; char begin = type . getBegin ( ) ; char term = type . getEnd ( ) ; int cursor = startPos + 1 ; while ( ( cursor < endPos ) && ( depth > 0 ) ) { if ( path . charAt ( cursor ) == term ) { if ( ! isEscaped ( path , cursor ) ) depth -- ; } else if ( path . charAt ( cursor ) == begin ) { if ( ! isEscaped ( path , cursor ) ) depth ++ ; } if ( depth == 0 ) { break ; } cursor ++ ; } return new CapturingGroup ( path , startPos , cursor ) ; }
Return the index of the terminating character in the group, excluding markers.
Return the index of the terminating character in the group excluding markers .