Lua string.match()问题

Lua string.match()问题,string,lua,match,String,Lua,Match,我想为一个字符串和几个数字匹配几行。 线条可以看起来像 " Code : 75.570 " 或 或 或 我想要像这样的东西 local name, numberLeft, numberCenter, numberRight = line:match("regex"); 但是我对字符串匹配非常陌生。这里是一个起点: s=" ..dll

我想为一个字符串和几个数字匹配几行。 线条可以看起来像

"  Code                                             : 75.570 "

我想要像这样的东西

local name, numberLeft, numberCenter, numberRight = line:match("regex");

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

这里是一个起点:

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

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

我不懂Lua语言,所以我不会帮你。 但是在Java中,这个正则表达式应该与您的输入匹配

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

您必须测试每个组,以了解是否存在左、中、右数据

看看,它可能是这样的。不保证,我没有看到如何转义具有特殊含义的
(dot),如果
在Lua中可用,也没有


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

此模式适用于所有情况:

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

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

请注意在模式中使用
+
-
*
之间的区别。更多关于模式的信息

这将匹配点和小数的任意组合,因此在之后尝试使用
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

@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

@Jacobs真的很好,谢谢。出于综合原因,我将重写代码;-)当然,我将实现您的正则表达式。

一个问题:名称的字符串前面是否总是有零个或两个句点,其余的字符串是字母?行首有两个空格字符,名称后面还有空格字符、冒号和1、2或3个数字(中间还有未知数量的空格字符,结尾是否有空格字符。这真的很复杂,有没有人有比字符串匹配更好的主意或解决方法?重新标记,因为Lua不包含正则表达式库。有关Lua模式匹配的更多详细信息,请参阅此项。您需要至少两个num但是,如果我分析正确的话,会有错误。另外一个数字分组不应该有一个
…而且,对这些分组使用
(\\d*\.?\\d*)
,使匹配更加精确不是更好吗?@Blak更正了缺少的
确实
(\\d*\.?\\d*)
更精确。
s="  ..dll                                   :          13.559       1"
for w in s:gmatch("%S+") do
        print(w)
end
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
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