Lua string.match()问题

时间:2011-06-05 15:25:25

标签: string lua match

我想为一个字符串和一些数字匹配几行。 这些行看起来像

"  Code                                             : 75.570 "

"  ..dll                                   :          13.559       1"

"  ..node                                    :  4.435    1.833    5461"

"  ..NavRegions                                     :  0.000         "

我想要像

这样的东西
local name, numberLeft, numberCenter, numberRight = line:match("regex");

但我对字符串匹配很新。

4 个答案:

答案 0 :(得分:5)

此模式适用于所有情况:

%s*([%w%.]+)%s*:%s*([%d%.]+)%s*([%d%.]*)%s*([%d%.]*)

简短说明:[]生成一组字符(例如小数)。数字的最后一个使用[set]*,因此空匹配也是有效的。这样,有效地分配了未找到的号码nil

请注意在模式中使用+ - *之间的区别。有关模式in the Lua reference的更多信息。

这将匹配点和小数的任意组合,因此尝试将其转换为tonumber()之后的数字可能会很有用。

一些测试代码:

s={
"  Code                                             : 75.570 ",
"  ..dll                                   :          13.559       1",
"  ..node                                    :  4.435    1.833    5461",
"  ..NavRegions                                     :  0.000         "
}
for k,v in pairs(s) do
    print(v:match('%s*([%w%.]+)%s*:%s*([%d%.]+)%s*([%d%.]*)%s*([%d%.]*)'))
end

答案 1 :(得分:1)

这是一个起点:

s="  ..dll                                   :          13.559       1"
for w in s:gmatch("%S+") do
        print(w)
end

当然,您可以将这些单词保存在表格中而不是打印中。并跳过第二个单词。

答案 2 :(得分:1)

@Ihf谢谢,我现在有了一个有效的解决方案。

local moduleInfo, name = {};
for word in line:gmatch("%S+") do
    if (word~=":") then
        word = word:gsub(":", "");
        local number = tonumber(word);
        if (number) then
            moduleInfo[#moduleInfo+1] = number;
        else
            if (name) then
                name = name.." "..word:gsub("%$", "");
            else
                name = word:gsub("%$", "");
            end
        end
    end
end

@jpjacobs非常好,谢谢。我会因为综合原因重写我的代码;-)我当然会实现你的正则表达式。

答案 3 :(得分:0)

我对Lua语言一无所知,所以我不会帮助你。 但在Java中,这个正则表达式应该匹配你的输入

"([a-z]*)\\s+:\\s+([\\.\\d]*)?\\s+([\\.\\d]*)?\\s+([\\.\\d]*)?"

您必须测试每个组以了解是否有数据,中心,右侧

看一下Lua,它看起来像这样。不保证,我没有看到如何逃避具有特殊含义的.(点),如果?在Lua中可用,也没有。

"([a-z]*)%s+:%s+([%.%d]*)?%s+([%.%d]*)?%s+([%.%d]*)?"