2016-01-14 4 views
1

Я пытаюсь сделать выражение регулярного выражения, которое захватывает несколько групп данных.Группа захвата Regex несколько раз и другие группы

Вот некоторые данные, например:

sampledata=X 
B : xyz=1 FAB1_1=03 FAB2_1=01 
A : xyz=1 FAB1_1=03 FAB2_1=01 

мне нужно, чтобы захватить X, который должен появиться один раз, и FAB1_1=03, FAB2_1=01 ... Все строки, которые начинаются с FAB.

Таким образом, я мог бы захватить все «FAB», как это:

/(FAB[0-9]_[0-9]=[0-9]*)/sg 

Но я не мог включать в себя захват X используя это выражение:

/sampledata=(?<samplegroup>[0-9A-Z]).*(FAB[0-9]_[0-9]=[0-9]*)/sg 

Это регулярное выражение возвращает только одну группу X и последний матч группы «FAB».

+2

Что-то вроде [ '(:?! SampleData = (\ S +) | (^) \ G) (? :(?! FAB [0-9] _ [0-9] =).) * (FAB [0-9] _ [0-9]) = ([0-9] *) ' ] (https://regex101.com/r/gA5zE6/1)? –

+0

@stribizhev Да, точно! Спасибо, я не очень понимаю ваше выражение, но оно работает. – ZwoRmi

+0

Опубликовать с объяснениями сейчас –

ответ

1

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

(?:sampledata=(\S+)|(?!^)\G)(?:(?!FAB[0-9]_[0-9]=).)*(FAB[0-9]_[0-9])=([0-9]*)‌​ 

См regex demo

Регулярное выражение основано на \G оператора, который соответствует или начало строки или конце предыдущего успешного матча. Мы ограничиваем его совпадением только в последнем случае с отрицательным взглядом (?!^).

Итак:

  • (?:sampledata=(\S+)|(?!^)\G) - соответствовать буквальным sampledata=, а затем сопоставить и захватить в 1-е группы, один или более непробельные символы -ИЛИ- соответствует концу предыдущего успешного матча
  • (?:(?!FAB[0-9]_[0-9]=).)* - матч любой текст, который не FABn_n= (это tempered greedy token)
  • (FAB[0-9]_[0-9]) - захват группы 2, согласование и захват FAB следуют с цифрой, то _ и еще одна цифра
  • = - буквальный =
  • ([0-9]*)‌​ - Захват группы 3, согласование и захват ноль или более цифр

Если у вас есть 1 sampledata= блок, вы можете смело раскатать закаленное жадный лексема (demo) как

(?:sampledata=(\S+)|(?!^)\G)[^F]*(?:F(?!FAB[0-9]_[0-9]=)[^F]*)*?(FAB[0-9]_[0-9])=([0-9]*) 
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

Таким образом, выражение будет более эффективным.

Если у вас есть несколько sampledata блоков, повысить закаленное жадный фишку:

(?:sampledata=(\S+)|(?!^)\G)(?:(?!sampledata=|FAB[0-9]_[0-9]=).)*(FAB[0-9]_[0-9])=([0-9]*) 

См another demo

+0

Просто примечание: разворачиваемый шаблон регулярного выражения не требует модификатора '/ s', темный леденелый токен. –

Смежные вопросы