正则表达式:通过多次捕获进行解析

时间:2018-03-28 15:31:49

标签: c# regex expresso

早上好。我从设备返回以下行

♥☺i20100☺i2010018032809120110000074653B0F4465275D245EAA80042D82F5E000000004291D83C00000000022000007460042FD45FE7F2A4648C0004282FC0400000000429799E500000000033000007466A869946694E8145BCF80042EF811B00000000428CCAF400000000044000007461DFFC4461D1D61462B040042A15A6600000000428E635100000000&&C631♥

数据在日期时间戳之后以6个字符的块返回。我试图超过日期时间并查找以42开头的所有6个块。应该返回3个块。
使用Expresso,我可以获得所有 .*i20100.i20100(?<Date>.{10})(?<AANNTT>.{6})+

的块

但是如何在每个子查询上创建子查询并返回以42开头的所有子查询?我认为可能是这样的:.*i20100.i20100(?<Date>.{10})(.{6})*(?<AANNTT>42.{4})+

但那只会返回最后一个。

提前致谢! -Dave

1 个答案:

答案 0 :(得分:1)

您可以使用

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

请参阅regex demo

<强>详情

  • (?<=i20100.i20100(?<Date>.{10})(?:.{6})*?) - 与字符串中紧邻的字符串中的位置匹配的正向前瞻
    • i20100.i20100 - i20100和char,但换行符i20100
    • (?<Date>.{10})(?:.{6})*? - 组Date匹配除换行符之外的10个字符,然后任意6个字符的重复次数,但换行符尽可能少
  • 42.{4} - 42,然后是换行符以外的任何4个字符

enter image description here