Also, it seems like lastRangeCharacter == lastMatchedIndex _except_ just this initial base state before any matches have been found.  As soon as addMatch() gets called, they're locked to the same value from then on.  Could we combine them?

If we do remove one, my preference is for the "-Index" naming -- "-Character" makes me think it stores the char itself (i.e. string of length 1) rather than an index.