A new explanation has been added to the
SCJP FAQ.
The key is that the asterisk (*) is a "greedy quantifier," specifying that whatever preceeds it should be matched zero or more times. By allowing for zero occurrances, a match of
zero length is possible. And because a match of zero length is possible, the find() method will check the index
following the last character of input.
For a match of zero length, the matcher's start() and end() methods both return the same index. And in these cases, the group() method returns an empty String (i.e., the substring from start() to end()).