static boolean regionMatches(final CharSequence cs, final boolean ignoreCase, final int thisStart,
                                 final CharSequence substring, final int start, final int length)    {
        if (cs instanceof String && substring instanceof String) {
            return ((String) cs).regionMatches(ignoreCase, thisStart, (String) substring, start, length);
        }
        int index1 = thisStart;
        int index2 = start;
        int tmpLen = length;

        // Extract these first so we detect NPEs the same as the java.lang.String version
        final int srcLen = cs.length() - thisStart;
        final int otherLen = substring.length() - start;

        // Check for invalid parameters
        if (thisStart < 0 || start < 0 || length < 0) {
            return false;
        }

        // Check that the regions are long enough
        if (srcLen < length || otherLen < length) {
            return false;
        }

        while (tmpLen-- > 0) {
            final char c1 = cs.charAt(index1++);
            final char c2 = substring.charAt(index2++);

            if (c1 == c2) {
                continue;
            }

            if (!ignoreCase) {
                return false;
            }

            // The same check as in String.regionMatches():
            if (Character.toUpperCase(c1) != Character.toUpperCase(c2)
                    && Character.toLowerCase(c1) != Character.toLowerCase(c2)) {
                return false;
            }
        }

        return true;
    }
static boolean regionMatches ( final CharSequence cs , final boolean ignoreCase , final int thisStart , final CharSequence substring , final int start , final int length ) { if ( cs instanceof String && substring instanceof String ) { return ( ( String ) cs ) . regionMatches ( ignoreCase , thisStart , ( String ) substring , start , length ) ; } int index1 = thisStart ; int index2 = start ; int tmpLen = length ; final int srcLen = cs . length ( ) - thisStart ; final int otherLen = substring . length ( ) - start ; if ( thisStart < 0 || start < 0 || length < 0 ) { return false ; } if ( srcLen < length || otherLen < length ) { return false ; } while ( tmpLen -- > 0 ) { final char c1 = cs . charAt ( index1 ++ ) ; final char c2 = substring . charAt ( index2 ++ ) ; if ( c1 == c2 ) { continue ; } if ( ! ignoreCase ) { return false ; } if ( Character . toUpperCase ( c1 ) != Character . toUpperCase ( c2 ) && Character . toLowerCase ( c1 ) != Character . toLowerCase ( c2 ) ) { return false ; } } return true ; }
Green implementation of regionMatches.

@param cs the {@code CharSequence} to be processed
@param ignoreCase whether or not to be case insensitive
@param thisStart the index to start on the {@code cs} CharSequence
@param substring the {@code CharSequence} to be looked for
@param start the index to start on the {@code substring} CharSequence
@param length character length of the region
@return whether the region matched