What appears to be happening with the second string is this:
You match HIT. Then you go looking matching
[^<]*?. The *? first tries to match the minimal number of characters, so it gets 0. And, the negative look-ahead does not try to do backtracking to make that
*? match more so it can make the negative look-ahead match. (update:
because, if it did that, then the look-ahead would be
doing more then just looking ahead in the string.)
Thus, it doesn't
find a match and the negative lookahead succeeds,
so the positive lookahead succeeds.