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