我正在尝试遍历所有“FindMe”节点,但我在模式匹配方面遇到了困难。这将用作另一个软件的插件,因此我尽量避免使用解析库。
给定以下 xml
<?xml version="1.0" encoding="utf-8"?>
<NodeA>
<NodeB>
<FindMe attr="1">
<NodeC attr="1" />
</FindMe>
<FindMe attr="2">
<NodeC attr="2" />
</FindMe>
</NodeB>
</NodeA>
当我尝试这个时,它只打印最后一场比赛
for k, _ in src:gmatch(".+(<FindMe .+</FindMe>).+") do
print(k)
end
<FindMe attr="2">
<NodeC attr="2" />
</FindMe>
当我尝试这个时,它会打印所有匹配的节点作为一个结果
for k, _ in src:gmatch('<FindMe.+>.+</FindMe>') do
print(k)
end
<FindMe attr="1">
<NodeC attr="1" />
</FindMe>
<FindMe attr="2">
<NodeC attr="2" />
</FindMe>
请您参考如下方法:
使用 .-
而不是 .+
, 这样 gmatch('<FindMe.+>.+</FindMe>')
变成 gmatch('<FindMe.->.-</FindMe>')
.使用 -
意味着非贪婪搜索,因此它在匹配之前获得尽可能少的字符数(而不是在与贪婪搜索匹配之前获得尽可能多的字符数)。您也可以使用 gmatch('<FindMe[^>]+>.-</FindMe>')
,效果应该是一样的。