Совпадение 4-го числа в строке с использованием регулярного выражения - PullRequest
1 голос
/ 09 июля 2019

Мне нужно сопоставить 4-е число в строке из 6 чисел, используя регулярное выражение.

  1. Эти числа используют запятую (,) в качестве разделителя тысяч и точку (.) В качестве десятичного разделителя.
  2. Числа всегда будут содержать точку, но не всегда запятую.
  3. Каждое число отделяется пробелом

Пример: Строка чисел, разделенных пробелами:

35 362,843 1 261,94 0 000 35 362 843 1 257,43 44 466 154,16

Мое регулярное выражение, использующее взгляд вперед и взгляд назад

(?<= )(\d*,*\d*\.\d*)(?= \d*,*\d*\.)

Фактический результат

1 261,94 0,000 35 362,843

Ожидаемый результат

35,362.843

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

Вы можете использовать

^(?:[\d,.]+\s){3}([\d.,]+)

и использовать первую группу захвата, см. демонстрацию на regex101.com .


Выражениечитается как
^                 # start of string / line
(?:[\d,.]+\s){3}  # non-capturing group with a character class [0-9,.] 
                  # followed by a whitespace, thrice
([\d.,]+)         # the part in question -> group 1


Но еще лучше: программно разбить пробелы и использовать полученный результат array[3] (при начале отсчета с нуля).
0 голосов
/ 09 июля 2019

Группа захвата с именем «четвертый» (группа захвата 1) даст ожидаемый результат:

(?<number>\d{1,3}(?:,\d{3})*\.\d*){0}(?:(?&number) ){3}(?<fourth>(?&number))(?=(?: (?&number)){2})

Позволяет разбить его на части:

(?<number>\d{1,3}(?:,\d{3})*\.\d*){0}

определяет имя «число», где число определяется как

  1. по крайней мере одна и не более 3 цифр
  2. опционально сопровождается бесконечным количеством коммы и тремя цифрами
  3. необходимый период
  4. бесконечное количество цифр (или ни одной)

(?:(?&number) ){3}

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


(?<fourth>(?&number))

Соответствует одному номеру, без пробела.


(?=(?: (?&number)){2})

Утверждают, что есть еще два числа, разделенных пробелами.


Как простое регулярное выражение

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

 (?:\d{1,3}(?:,\d{3})*\.\d* ){3}(\d{1,3}(?:,\d{3})*\.\d*)(?=(?: \d{1,3}(?:,\d{3})*\.\d*){2})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...