Регулярное выражение, совпадающее с несколькими числами в строке - PullRequest
2 голосов
/ 01 ноября 2019

Я хотел бы извлечь числа из строки, такой как

В этих трех городах 1000 человек.

и получить массив типа ["1,000", "3"].

Я получил следующее число, соответствующее регулярному выражению от Джастин в этом вопросе

^[+-]?(\d*|\d{1,3}(,\d{3})*)(\.\d+)?\b$

Это прекрасно работает для проверки, является ли это число, но заставляет его работать напредложение, которое необходимо удалить «^» и «$».

regex101 с определением начала / конца regex101 без определения начала / конца

Без определения начала и конца вы получите набор из 0 совпадений длины, которые можно легко отбросить, но теперь также разбивает любые числа с запятой в них.

Как сделать это регулярное выражение (или новое регулярное выражение)работайте над предложениями и по-прежнему находите числа с запятыми в них.

Бонусом будет также отсутствие всех совпадений длины 0.

Ответы [ 3 ]

4 голосов
/ 01 ноября 2019

Выражение /-?\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]* - ноль или более запятых и цифр

Первая альтернатива будет жадно совпадать, возвращаясь ко второй альтернативе, если нет десятичной точки.

1 голос
/ 02 ноября 2019

Один альтернативный подход - разделить пробелом и посмотреть, может ли значение быть проанализировано на число,

let numberExtractor = str => str.split(/\s+/)
                                .filter(v => v && parseFloat(v.replace(/[.,]/g, '')))


console.log(numberExtractor('There are 1,000 people in those 3 towns. some more numbers -23.012 1,00,000,00'))
1 голос
/ 01 ноября 2019

Чтобы сопоставить целые и десятичные числа, где целая часть может иметь необязательные
запятые, которые находятся между числами, но не в десятичной части, делается так:

/[+-]?(?:(?:\d(?:,(?=\d))?)+(?:\.\d*)?|\.\d+)/

https://regex101.com/r/yOuBPx/1

Входная выборка не отражает все граничные условия, которые выполняет это регулярное выражение.
Лучше всего поэкспериментировать, чтобы увидеть его полный эффект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...