Выражение /-?\d(?:[,\d]*\.\d+|[,\d]*)/g
должно сделать это, если вы в порядке с разрешением использовать разные группы, например, 1 000 000 (что неизвестно в некоторых регионах). Я чувствую, что смогу еще больше упростить это, но когда я попробую пример, «333.33» будет разбит на «333» и «33» как отдельные числа. С учетом всего вышесказанного это сохраняется вместе.
Live Пример:
const str = "There are 10,000 people in those 3 towns. That's 3,333.33 people per town, roughly. Which is about -67.33 from last year.";
const rex = /-?\d(?:[,\d]*\.\d+|[,\d]*)/g;
let match;
while ((match = rex.exec(str)) !== null) {
console.log(match[0]);
}
Пробой /\d(?:[,\d]*\.\d+|[,\d]*)/g
вниз:
-?
- необязательный знак минуса (спасибо x15 запометив это в своем ответе !) \d
- цифра (?:...|...)
- группа без захвата, содержащая чередование [,\d]*\.\d+
- ноль или более запятых и цифр, за которыми следует .
и одна или несколько цифр, например 3,333.33
;или [,\d]*
- ноль или более запятых и цифр
Первая альтернатива будет жадно совпадать, возвращаясь ко второй альтернативе, если нет десятичной точки.