Вы можете использовать следующее регулярное выражение:
^(?:\s*(?:[1-9]|0(?=\.))\d*(?:\.\d+)?){4}\s*$
Демо
Если регулярное выражение совпадает со строкой, подстроки, представляющие числа, можно извлечь, разбив строку в одном или нескольких пробелах.
Если целые числа не разрешены (только с плавающей запятой), удалите знак вопроса из (?:\.\d+)?
.
Следующие строки не сопоставлены по указанным причинам:
123.45 67.891 0.234
# too few numbers
123.45 67.891 0.234 5678.90 12.34
# too many numbers
123.45 .67.891 22 5678.90
# .67.891 is incorrect
123.45 067.891 22 5678.90
# 067.891 contains a leading zero
123.45 .891 0.234 5678.90
# .891 requires a leading zero to be correct
Если желательно, чтобы любой из двух последних примеров соответствовал, регулярное выражение могло бы быть отрегулировано в соответствии с
Механизм регулярного выражения выполняет следующие операции.
^ # match beginning of string
(?: # begin non-cap grp
\s* # match 0+ spaces
(?: # begin non-cap grp
[1-9] # match a digit other than zero
| # or
0 # match 0
(?=\.) # match '.' in positive lookahead
) # end non-cap grp
\d* # match 0+ digits
(?:\.\d+) # match '.' followed by 1+ digits in non-cap grp
? # optionally match non-cap grp
) # end non-cap grp
{4} # execute non-cap grp 4 times
\s* # match 0+ spaces
$ # match end of line