【问题标题】:Finding the first string that matches a pattern in Lua (XML pattern matching)查找与 Lua 中的模式匹配的第一个字符串(XML 模式匹配)
【发布时间】:2011-06-28 23:13:57
【问题描述】:

我目前正在使用以下代码来解析 Xml 文件的一部分(我首先将整个文件读入单个字符串)。

for xmlMatch in xmlString:gmatch("<MyXmlElement.*</MyXmlElement>") do
    -- Do something.
end

我遇到的问题是 for 循环只执行一次,因为 gmatch 函数只返回一个字符串,该字符串从 MyXmlElement 的第一个实例开始,到 MyXmlElement 的最后一个实例的关闭结束。我如何解析字符串,以便在找到字符串"&lt;/MyXmlElement&gt;" 时匹配模式(而不是仅在最后一个情况下)?

【问题讨论】:

    标签: xml string lua lua-patterns


    【解决方案1】:

    这里有 3 个问题:

    • gmatch 从字符串中返回捕获的子字符串,因此您需要在要在循环中使用的内容周围使用 ()
    • 为了匹配尽可能少的字符,你应该使用.-作为模式直到第一个可能的&lt;/MyXmlElement&gt;
    • 你需要在 for 之后使用变量(但我猜这只是一个错字)

    所以大家一起来:

    for att,cont in XmlString:gmatch'<MyXmlElement%s*(.-)>(.-)</MyXmlElement>' do
        -- something
    end
    

    应该可以解决问题。

    【讨论】:

    • 你为什么使用 %s+ 而不是 %s- ? '' 将与 '' 不匹配,因为它要求标签名称后至少有 1 个空格。所以它只会匹配带有属性的 MyXmlElement 标签。
    • 好点。仅使用属性对其进行了测试。 %s- 确实更好,在我的回答中更正了。
    • %s* 在这种情况下比 %s- 更好
    • 你是对的,如果使用-,并且标签和属性之间有多个空格,从第二个空格开始将与属性一起捕获...更改答案。
    猜你喜欢
    • 2011-03-29
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 2020-08-21
    • 2011-02-03
    相关资源
    最近更新 更多