Попытка разобрать числа с регулярным выражением - PullRequest
1 голос
/ 05 июля 2019

Я пытаюсь разобрать все числа из текста:

text 2030 text 2,5 text 2.000.000 2,000,000 -200 +31600000000. 200. 2.5 200? 1:200

На основе этого регулярного выражения:

(?<!\S)(\-?|\+?)(\d*\.?\,?\d+|\d{1,3}(,?.?\d{3})*(\.\,\d+)?)(?!\S)

Но такие окончания, как ., ?, !, , сразу после того, как число не совпадает.Я хочу только полные совпадения с preg_match_all.(см. изображение)

Overview of matches

Я предполагаю, что проблема в последней части моего регулярного выражения (?!\S).Я пробовал разные вещи, но не могу понять, как это решить.

1 Ответ

5 голосов
/ 05 июля 2019

Если мы не хотим проверять наши числа, возможно, мы могли бы начать с простого выражения, может быть, что-то похожее на:

(?:^|\s)([+-]?[\d:.,]*\d)\b

Тест

$re = '/(?:^|\s)([+-]?[\d:.,]*\d)\b/s';
$str = 'text 2030 text 2,5 text 2.000.000 2,000,000 -200 +31600000000. 200. 2.5 200? 1:200
';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

var_dump($matches);

Вправая панель этой демонстрации , выражение будет дополнительно объяснено, если вам может быть интересно.


РЕДАКТИРОВАТЬ:

Другое выражение будет:

(?:^|\s)\K[+-]?(?:\d+:\d+|\d+(?:[.,]\d{1,3})+|\d+)\b

, который не подтвердит наши номера и просто соберет перечисленные, с некоторыми недействительными номерами.

ДЕМО 2

ДЕМО 3

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