A match attempt starts only where a run of local-part characters starts, or where the previous match ended (\G). Every attempt inside a run would scan to the same @, so this finds exactly the matches an unanchored local part would, and scans each run once: the time is linear in the length of the text, where an unanchored local part took quadratic time on a long run of letters or digits (#1713).