A dot inside square brackets is literal, so [.] matches a dot. Therefore, [.?] matches either one or zero dots, and [^.?] would match anything other than one or zero dots (i.e. any non-dot non-null character). Thus ^([^.?]+)$ would match one or more non-dot non-null characters. ^(.+)$ would match a string of dots, and ^([^.]+)$ would almost work, matching any string consisting of non-dot characters, but it would also match the null set.

Or perhaps, since [^.] would match a single non-dot character, [^.?] would match zero or one non-dot characters and ^([^.?]+)$ would a line of zero or more characters, provided it did not contain a dot, and ^([^.]+)$ would match a string of one or more non-dot characters, but would not match an empty string. This stuff is kinda tricky, huh?