Регулярные выражения: разбор нескольких захватов

Доброе утро. У меня есть следующая строка, возвращенная с устройства

♥☺i20100☺i2010018032809120110000074653B0F4465275D245EAA80042D82F5E000000004291D83C00000000022000007460042FD45FE7F2A4648C0004282FC0400000000429799E500000000033000007466A869946694E8145BCF80042EF811B00000000428CCAF400000000044000007461DFFC4461D1D61462B040042A15A6600000000428E635100000000&&C631♥

Данные возвращаются блоками по 6 символов после отметки даты и времени. Я пытаюсь обойти дату и время и найти все блоки из 6, начинающиеся с 42. Должно быть возвращено 3 блока.
Используя Expresso, я могу получить все блоки .*i20100.i20100(?<Date>.{10})(?<AANNTT>.{6})+

но как я могу сделать подзапрос для каждого из них и вернуть все, начиная с 42? Я думал, что это может быть так: .*i20100.i20100(?<Date>.{10})(.{6})*(?<AANNTT>42.{4})+

но это только возврат последнего.

Заранее спасибо! -Dave

1 ответ

Решение

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

(?<=i20100.i20100(?<Date>.{10})(?:.{6})*?)42.{4}

Посмотреть демо-версию регулярного выражения

подробности

  • (?<=i20100.i20100(?<Date>.{10})(?:.{6})*?) - положительный прогноз, соответствующий местоположению в строке, которому непосредственно предшествует
    • i20100.i20100 - i20100и символ, но символ новой строки, i20100
    • (?<Date>.{10})(?:.{6})*? - группа Date который соответствует 10 символам, кроме новой строки, затем любые 0+ повторений любых 6 символов, кроме новой строки, как можно меньше
  • 42.{4} - 42 а затем любые 4 символа, кроме новой строки

Другие вопросы по тегам