Простой REGEX для печати определенных записей из строки

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

2017-07-13 11:23:43.717948 [CRIT] mod_dptools.c:1713 SRC=7479569217;7479569217;768733974848304;7479569217;300067;333;-1

Я пытаюсь напечатать определенные значения между ;, которые являются числовыми (всегда). Например, я хочу напечатать 1-е, 3-е и 5-е число между ;.

Я попробовал этот шаблон:

(?=;).+?(?=;).+?.+?(?=;)

Он напечатает 2-й и 3-й. Не уверен, как напечатать, например, 2-й и 4-й, не печатая также и 3-й...

ОБНОВЛЕНИЕ:

Может я недостаточно ясно выразился или пример был не в лучшем виде. Итак, позвольте мне добавить к нему дополнительную информацию:

2017-07-13 11:23:43.717948 [CRIT] mod_dptools.c:1713 SRC=123;1234567890;00000000;2222222;7479569217;87654321;300067;333;-1

Мой ожидаемый результат: 123;00000000;7479569217;300067;333;-1

Это означает 1-й номер, затем 3-й, 5-й, 6-й, 7-й, затем 8-й.

Лучше всего было бы выбрать позже, если мне нужны изменения, например, распечатать только 2-ю, 3-ю, 4-ю и 5-ю запись.


person Bogdan Stoica    schedule 13.07.2017    source источник
comment
Каковы ожидаемые матчи? Может быть, вы хотите \d+(?=;|$)?   -  person Wiktor Stribiżew    schedule 13.07.2017
comment
768733974848304;7479569217;300067;333;-1 скажем, мне нужно распечатать только те   -  person Bogdan Stoica    schedule 13.07.2017
comment
-?\d+(?:;-?\d+){4}$?   -  person Wiktor Stribiżew    schedule 13.07.2017
comment
Или даже: (?<=[;=])-?\d+?   -  person Washington Guedes    schedule 13.07.2017
comment
Я отредактировал свой вопрос и предоставил более подробную информацию. Спасибо вам обоим за ваш ответ. Первый работает, но это не совсем то, что мне нужно; второй ничего не показывает. Я использую онлайн-инструмент для регулярных выражений от regex101.   -  person Bogdan Stoica    schedule 13.07.2017
comment
в соответствии с regex101 по умолчанию выбран pcre/php   -  person Bogdan Stoica    schedule 13.07.2017
comment
Я имел в виду, на каком языке / языке регулярных выражений вы пишете свою программу?   -  person anubhava    schedule 13.07.2017
comment
Я намерен использовать его в FreeSwitch в файле конфигурации, который отформатирован в стиле XML, но я полагаю, что он использует PCRE.   -  person Bogdan Stoica    schedule 13.07.2017


Ответы (2)


Если вы доверяете данным в своем файле журнала и не хотите проверять, чтобы ваши значения содержали только - и числа, вы можете просто использовать отрицательный класс символов, содержащий ; (это повысит эффективность шаблона), и заключать в скобки только те значения, которые вы хотите.

Шаблон: (Демо)

#not captured--vv------------vv
     =([^;]*;)[^;]*;([^;]*;)[^;]*;([^;]*;)([^;]*;)([^;]*;)([^;]*;)(.*)
         $1            $2            $3      $4      $5      $6    $7

Обратите внимание, что в последней группе захвата ($7) вместо отрицательного класса символов используется точка. Это делается для того, чтобы шаблон не пытался сопоставиться на следующей строке. Я предполагаю, что это важная функция, потому что в вашем файле журнала будет много строк данных. (если нет, то конечная группа захвата может быть такой же, как и предыдущие)

Я использую * в качестве квантификатора "ноль или больше" на тот случай, если файл журнала может содержать пустые значения между точками с запятой. Если файл журнала всегда содержит число для каждого значения, то + можно использовать в качестве квантификатора.

Если вам нужно проверить значения, подойдет шаблон Усаги.

Объединение моих групп захвата следующим образом: =([^;]*;)[^;]*;([^;]*;)[^;]*;([^;]*;[^;]*;[^;]*;[^;]*;.*) или =([^;]*;)[^;]*;([^;]*;)[^;]*;((?:[^;]*;){4}.*) успешно уменьшает общее количество групп захвата и повышает эффективность и краткость шаблона, но немного затрудняет обновление шаблона в будущем. Более подробный шаблон упростит изменение группы захвата. Вам решать, какой шаблон выбрать на основе проверки, эффективности, краткости и ремонтопригодности.

person mickmackusa    schedule 13.07.2017

Попробуйте что-то вроде этого:

=(-?\d+;)-?\d+;(-?\d+);-?\d+(;-?\d+)(;-?\d+)(;-?\d+)(;-?\d+)(;-?\d+)

Отредактировано

минуса не заметил...

person Usagi Miyamoto    schedule 13.07.2017
comment
Ваше регулярное выражение не соответствует строке темы. БЫСТРЫЙ СПРАВОЧНИК. Ничего не показывать... Я думаю, у вас может быть опечатка в регулярном выражении - person Bogdan Stoica; 13.07.2017
comment
@BogdanStoica Я думаю, он имел в виду: =(\d+);\d+;(\d+);\d+;((?:-?\d+;?){5})\K ... Кстати, я добавил \K просто для иллюстрации лучше его идея. - person Washington Guedes; 13.07.2017