2016-09-04 4 views
0

У меня возникла проблема с анализом некоторых полей из следующего регулярного выражения, которое я загрузил в rubular. Строка, которую я обрабатываю, является специальным заголовком из баннера FTP-сервера. Для того, чтобы я обработать этот баннер, линияАнализ нескольких групп из регулярного выражения

special:pTXT1TOCAPTURE^:mTXT2TOCAPTURE^:uTXT3TOCAPTURE^ 

Я думал, что: (?i)^special(:[pmu](.*?)\^)?* будет делать трюк, однако, к сожалению, это только дает мне последний матч и я не знаю, почему, как я лениво пытается захватить каждая группа. Также обратите внимание, что я должен быть в состоянии захватить пустую строку также, т.е. если для экс строка матча содержит: и^

Wrap слова Показать невидимки рубинового версия результата матча: специального: pTXT1TOMATCH ^: mTXT2TOMATCH ^: uTXT3TOMATCH^ Матч группы:

  1. : uTXT3TOMATCH^
  2. TXT3TOMATCH

идея заключается в том, что строка должна начинаться с теста 'специальный' с последующим до 3 са группы pture, ограниченные p, m или лень, до следующего символа ^. Мне нужно зафиксировать текст, указанный выше - в основном мне нужно найти TXT1TOCAPTURE, TXT2TOCAPTURE и TXT3TOCAPTURE. Должна быть хотя бы одна из этих трех групп захвата.

Заранее спасибо

+0

Если рубин то, что PCRE тег? – revo

+0

Фактически выражение должно быть совместимо с pcre - фактическая среда выполнения использует pcre на моем компьютере. Я должен был это ясно понять. – johnco3

ответ

1

У вас есть две проблемы с вашим RegEx: одна синтаксическая и одна концептуальна.

синтаксического:

У нас нет такого модификатора ?* в PCRE, но оно равно * в Ruby, который обозначает жадный квантор. В случае применения к группе захвата он фиксирует последнее совпадение.

Концептуальный:

Используя ленивый квантор .*? не дает вам по-прежнему матчи. Он немедленно останавливается на удовлетворении двигателя. В то время как модификатор g на следующем совпадении никогда не встречается, так как нет ^special на следующей позиции последнего матча.

Решение использует \G маркер выгоды от его среднего начального согласования в конце предыдущего матча:

(?:special|(?!\A)\G):([pmu][^^]*\^) 

Live demo

+0

Если вы посмотрите на мой комментарий к OP, вы заметите его более старый, чем ваш ответ. Это значит, что я раньше задавал вопрос и, вероятно, решил что-то написать.И в ответ на ваш вопрос, если вы посмотрите внимательно, вы найдете больше различий в * предоставленных деталях *. Ваш RegEx также не удовлетворяет требованиям OP * полностью *, которые моя делает взамен. @Jan – revo

+0

Вы можете помочь мне понять, как работает (?:^Special | (?! \ A) \ G). В частности, я не знаком с синтаксисом (?! \ A) \ G '. Мышь над текстом в живой демонстрации не очень понятна, как это работает. – johnco3

+0

Если двигатель - в самом первом месте - пытается совпадение в начале строки, он видит '^ special', соответствует ему, а затем продолжает остаток шаблона. Поскольку у нас есть модификатор 'g' (он должен быть установлен) после удовлетворительного * ходьбы *, он продолжается с того места, где предыдущая прогулка была успешно завершена (сразу после' pTXT1TOCAPTURE^'). Чтобы начать новый механизм соответствия, снова начинается с начала RegEx. Он попадает в '^ special', но не видит его в строке, а затем переходит на вторую сторону чередования, он видит' (?! \ A) \ G' и соответствует. '\ G' точно означает * начало строки * OR * конец предыдущего совпадения *. – revo

0

Вы могли бы хотеть иметь модификатор \G:

(?:(?:^special:)|\G(?!\A)\^:)[pmu]([^^]+) 

Смотреть это работает на rubular.com.