正则表达式捕获与固定点的重叠匹配

时间:2015-08-17 13:39:06

标签: regex xml

所以我需要一个正则表达式,它可以收集来自频道的Cididvisibility属性值,其中Cid由{的多个变量对共享id {1}}和visibility。我似乎只能抓住第一场比赛(0136, 10000, 21),而不是第二场比赛或任何其他比赛,例如(0136, 5000, 21)。请记住,XML有多个渠道。

<channel Cid="0x0136">
   <type>A</type>
   <characteristics var1="0.1" var2="V" var3="3">
        <custom_range id="10000" visibility="21"></custom_range>
        <custom_range id="5000" visibility="21"></custom_range>
   </characteristics>    
   <visibility>0</visibility>
</channel>

我的正则表达式是:

/\bCid?\b="0x([0-9a-fA-F]+)"(?=(?!Cid)(?s).*id="([0-9]+)" visibility="([0-9]+)")/g

1 个答案:

答案 0 :(得分:0)

正则表达式匹配某些文本,如果成功,则在最后一次匹配结束时再次尝试。

所以你将有一次你的Cid比赛和id&amp;能见度捕获了几次。问题是你只能访问最后一次捕获(.NET是一个例外)。

也许XPATH允许更强大或更优雅的解决方案,但我从来没有必要接受它。

使用正则表达式,您可以先使用

Cid="(.*?)"(.*?)</channel>

现在Cid在第1组中,您在第2组上应用另一个正则表达式

id="(.*?)".*?visibility="(.*?)"

我在第1组,在第2组中可见。

现在可以使用任何命令式语言编写三元组,在2个循环中使用几行代码。