And such is the case here.
"You're doing it wrong, but I'm not going to tell you what it is you're doing wrong nah nah nah"
That's the good thing about long lasting platforms such as Java - APIs become mature because they've been tested and re-tested by thousands of people for more than a decade. And thus when you go to use them and have to think "wtf", you can be almost certain you simply don't understand and meanies in forums can say so without having any ammunition to back up that accusation.
Now for an actual answer.
(.*) is going to produce two matches "abc" and "" (the end of the string) because the * means we can have zero. Idk if this is standard regex but it's what java does. So, we are going to replace with with "xyz" and produce "xyzxyz"
(.+) only has the one match and works like expected
(.*?) is lazy and weird and is going to get 4 capture groups of nothing. To visualize, "|" is where a capture is "|a|b|c|". so we are going to produce "xyzaxyzbxyzcxyz"
(.*+) Idk what this even should do lol
so on and so forth
This all has to do with the fact that regex .* seems to act funny.