my $num_rex=qr/(-?(?:\d+(?:\.\d*)?|\.\d+))/; # modified from: perldoc -q scalar is a number while () { if (/^\s* (\w+) \s+ $num_rex \s+ $num_rex (?: \s+ $num_rex \s+ $num_rex )? \s*$/x) { print "Matched a word and ",(defined $4?"four":"two")," numbers: $1 $2 $3",(defined $4?" $4 $5\n":"\n"); } } __DATA__ Abc 21223.7 21225.33 22270.3 22280.1 Def 21600.23 24567.43