2011-08-28 76 views
1

我怎样才能匹配以下字符串与一个表达式?Lua string.match问题?

local a =“[a 1.001523] < 1.7 | [012]> < a123> <?0?>”;

local b =“[b 2.68] < ..>”;

local c =“[b 2.68] <>”;

local d =“[b 2.68] <> <> <>>;本地名称,netTime,参数1,参数2,参数X =字符串:匹配(?);

- (string是A或B或C或d)

的问题是,该字符串可以有不同的参数计数( “< ...>”)和参数可以有一个数字,字符,特殊的字符或空格。 我是Lua的新手,需要学习字符串匹配,但几个小时后我无法学习。我问你,因为我明天需要结果,我真的很感谢你的帮助!

欢呼:)

回答

1

Lua的模式是非常有限的,你不可能有替代的表情和没有可选组。所以这意味着你所有的参数都需要与相同的表达式匹配,如果你只写一个模式,你需要使用固定数量的参数。检查这tutorial,适应lua模式不需要很长时间。

您可能仍然能够使用多种模式解析这些字符串。 ^%[(%a+)%s(%d+%.%d+)%]%s是你可以做得最好的第一部分,假设本地名称可以有多个大写和小写字母。要匹配参数,请在输入的一部分上运行多个模式,如<%s*><(%w+)>以单独检查每个参数。

另外得到一个正则表达式库或解析器,这在这里会更有用。

1

Lua模式确实有限,但如果您可以做出一些假设,则可以避开。就像如果不会有>的在争论你可以只以上的<>所有匹配的双循环:

local a = "[a 1.001523] <1.7 | [...]> <a123> < ? 0 ?>" 
local b = "[b 2.68] <..>" 
local c = "[b 2.68] <>" 
local d = "[b 2.68] <> < > < ?>" 

function parse(str) 
    local name,nettime,lastPos = str:match'%[(%a+)%s(%d+%.%d+)%]()' 
    local arguments={} 
    -- start looking for arguments only after the initial part in [ ] 
    for argument in str:sub(lastPos+1):gmatch('(%b<>)') do 
     argument=argument:sub(2,-2) -- strip <> 
     -- do whatever you need with the argument. Here we'll just put it in a table 
     arguments[#arguments+1]=argument 
    end 
    return name,nettime,unpack(arguments) 
end 

对于更复杂的东西,你就可以使用像LPEG的东西,像kapep说的更好。