The . in my solution would match any first character, which is “O”
What I’m having trouble with is why doesn’t my [^h]+ work? I understand it as “match anything that is not “h” until the end of the string”

as your regex does not have any indication on start or end of string, the . matches an “h”, and the h{3,6} matches the other 6, so the [^h]+, after the "h"s, no other “h”, but before? . matches any character, “h” included

Because its just shifting over and the . will find the first h, and h{3,6} will then find 3-6 more h’s, so possibly 7 h’s. Then [^h]+ then finds the no