Вы можете использовать класс символов для сопоставления либо точки, либо запятой, за которыми следуют 1+ цифр в необязательной группе:
^\d+(?:[,.]\d+)?(?: \d+(?:[,.]\d+)?)*$
Это будет соответствовать
^
Начало строки \d+(?:[,.]\d+)?
Совпадение цифр 1+ с необязательной частью для совпадения с точкой или запятой, за которыми следуют цифры 1+ (?: \d+(?:[,.]\d+)?)*
повтор предыдущей части 0+время с пробелом в начале $
Конец строки
Regex demo
Обновление
Если строка может содержать только одну точку или запятую:
^(?!(?:[^.,\n]*[.,]){2})\d+(?:[,.]\d+)?(?:[^\S\n\r]\d+(?:[,.]\d+)?)*$
^
Начало строки (?!(?:[^.,\n]*[.,]){2})
Отрицательный взгляд вперед, подтвердитьто, что справа, не в 2 раза больше точки или запятой \d+(?:[,.]\d+)?
Совпадение 1+ цифр, опционально совпадение точки или запятой и 1+ цифр (?:
Группа без захвата [^\S\n\r]
Класс отрицательных символов , не соответствует непробельному символу и не соответствует символу новой строки \d+(?:[,.]\d+)?
Соответствует 1+ цифрам, дополнительно соответствуетточка или запятая и 1+ цифры )*
Закрыть группу без захвата и повторить 0+ раз
$
Конец строки
Regex demo
let regex = /^(?!(?:[^.,\n]*[.,]){2})\d+(?:[,.]\d+)?(?:[^\S\n\r]\d+(?:[,.]\d+)?)*$/;
[
"424242424",
"424242.424",
"454545.58",
"4545454,4545",
"45454,45",
"4 45 44454.45",
"4 454 454,45",
"1 2 3",
"1 2 3",
"4,2 424 484,45 34.4 3 4",
"545g45",
"454.454.45",
"45454,454,45",
"45.44,45",
"45,45.45",
"4 4545 4545 45 45",
].forEach(s => console.log(s + ": " + regex.test(s)))