Regex для подстроки списка через запятую - PullRequest
4 голосов
/ 24 апреля 2019

Я новичок в регулярных выражениях, поэтому я заранее извиняюсь, если это наивный вопрос!

У меня есть строка с двумя значениями, разделенными запятой: 12.345678,23.45678901

Я пытаюсь использовать регулярное выражение (это требование), чтобы вернуть первое значение с 3 десятичными знаками 12.345 и второе значение с 2 десятичными знаками 23.45.

В идеале полное соответствие регулярному выражению должно быть 12.345,23.45

Я могу получить первое значение 12,345, используя следующее регулярное выражение: ^\d+\.\d{0,3}.

Это работает хорошо, потому что возвращает только полное совпадение (совпадение в группе 1 отсутствует).Но я довольно озадачен тем, как получить второе значение 23,45, которое будет возвращено в той же строке.

Я также пробовал это регулярное выражение: (^.{0,6})(?:.*)(,)(.{0,5}), которое правильно анализирует первое и второе значения, нополное совпадение возвращается со слишком большим количеством знаков после запятой.

Полный матч: 12.345678,23.45

Группа 1: 12.345

Группа 2: ,

Группа 3: 23.45

Любые предложения приветствуются!Заранее спасибо.

1 Ответ

3 голосов
/ 24 апреля 2019

Вы можете использовать это регулярное выражение для получения ваших данных:

^(\d+\.\d{3})\d*,(\d+\.\d{2})\d*$

Он ищет цифры, за которыми следуют . и 3 знака после запятой (первая группа захвата), затем некоторое количество цифр, за которыми следует запятая (отбрасывается), а затем цифры, за которыми следуют . и 2 знака после запятой (второй захват группа), за которым следует некоторое количество цифр и конец строки (отбрасывается).

Для использования в PHP

$str = '12.345678,23.45678901';
preg_match('/^(\d+\.\d{3})\d*,(\d+\.\d{2})\d*$/', $str, $matches);
echo "first number: {$matches[1]}\nsecond number: {$matches[2]}\n";

Выход:

first number: 12.345 
second number: 23.45

Демонстрация на 3v4l.org

Если вам нужно получить оба совпадения в массиве $matches[0] (используя preg_match_all), вы можете использовать это регулярное выражение:

(?<=^)\d+\.\d{3}(?=\d*,)|(?<=,)\d+\.\d{2}(?=\d*$)

Это регулярное выражение ищет либо

  • начало строки, за которым следуют несколько цифр, . и 3 цифры (за которыми следует некоторое количество цифр и запятая); или
  • запятая, некоторое количество цифр, . и 2 цифры (за которыми следует некоторое количество цифр и конец строки).

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

Демонстрация на 3v4l.org

...