*
means 0 or more occurances, $
anchors the match to the end of line, so it's allowing (probably) trailing spaces, but not tabs, unless it's actually a tab.
No if you remove that white space, lines with invisible spaces after them won't match.
As it stands it's matching a line sequence of one or more non-digits, followed by optional digits and optional spaces.
Actually if debugging I'd have to look up what happens on a line like "12345 " with the non-greedy matching as I'd tend to write myself something like "^(\D+(\d+))\s*$" or "^(\D*.(\d+))\s*$" depending on intention. In old days you had to code against the greedy matching yourself, which means I generally avoid stuff like .+(\d*) through habit. Capturing 0 digits generally is a bug, as is having first digit consumed by .+