Регулярные выражения: разбор нескольких захватов
Доброе утро. У меня есть следующая строка, возвращенная с устройства
♥☺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 символа, кроме новой строки