我想为一个字符串和一些数字匹配几行。 这些行看起来像
" Code : 75.570 "
或
" ..dll : 13.559 1"
或
" ..node : 4.435 1.833 5461"
或
" ..NavRegions : 0.000 "
我想要像
这样的东西local name, numberLeft, numberCenter, numberRight = line:match("regex");
但我对字符串匹配很新。
答案 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]*)?"