Lua字符串匹配(string.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");

但是我对字符串匹配非常陌生。

原文链接 https://stackoverflow.com/questions/6243829

点赞
stackoverflow用户107090
stackoverflow用户107090

以下是一个起点:

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

当然,你可以把这些单词保存在一个表中,而不是打印它们,而且还要跳过第二个单词。

2011-06-05 16:07:35
stackoverflow用户484046
stackoverflow用户484046

我不熟悉 Lua 语言,所以无法在这方面帮助你。

但是在 Java 中,这个正则表达式可以匹配你的输入。

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

你必须测试每个组来确定是否还有数据:左边,中间,右边

在查看 Lua 之后,它可能看起来像这样。不保证,我没有看到如何转义 .(点),它有特殊含义,并且也不知道 ? 是否可在 Lua 中使用。

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

2011-06-05 17:29:45
stackoverflow用户513763
stackoverflow用户513763

这个模式对于每个情况都有效:

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

简短解释:[] 创建字符集(例如小数)。最后两个数字使用 [set]*,这样空匹配也是有效的。这样,未找到的数字将有效地被赋值为 nil

注意在模式中使用 + - * 的区别。有关模式的更多信息,请参阅 Lua 参考手册

这将匹配任何点和小数的组合,因此后续使用 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
2011-06-05 18:51:39
stackoverflow用户785043
stackoverflow用户785043

@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 很棒,也谢谢你。出于综合考虑,我会重新编写我的代码;-) 当然我会使用你的正则表达式。

2011-06-05 19:21:18