There are a couple of general rules I use to keep track of things.
The engine prefers the leftmost, longest match. If it can match something early in the string or late in the string, it prefers the former.
Using an anchor, obviously, changes this.
The default quantifiers (* and +) are greedy. They prefer longer matches, and will happily gobble up everything in the string.
All of these rules apply to each element of the regex. If the first element of the regex is greedy, it'll land at the end of the string. To match the next element, the engine will backtrack one character at a time to see if it can match.
Internal optimizations in the engine can avoid some of the caveats these rules imply, but they tend not to change the rules.
I second the recommendation of Mastering Regular Expressions, though I hear Jeff's working on a new version at the moment.