IT序号网

regex之使用 Lua 遍历 XML 节点

xmjava 2024年02月27日 编程语言 30 0

我正在尝试遍历所有“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>') ,效果应该是一样的。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!