如何将以下字符串与一个表达式匹配?
local a =“[a 1.001523]< 1.7 | [...]>< a123><?0?>”;
local b =“[b 2.68]< ..>”;
local c =“[b 2.68]<>”;
本地d =“[b 2.68]<><><?>”;
本地名称,netTime,argument1,argument2,argumentX = string:match(?);
- (字符串是a或b或c或d)
问题是,字符串可以有多种参数(“< ...>”),参数可以包含数字,字符,特殊字符或空格。 我是Lua的新手,我必须学习字符串匹配,但我在几个小时内就无法学到这一点。我问你,因为我明天需要结果,我真的很感激你的帮助!
欢呼:)答案 0 :(得分:1)
Lua模式非常有限,您不能拥有替代表达式而且没有可选组。因此,这意味着所有参数都需要与相同的表达式匹配,如果只编写一个模式,则需要使用固定数量的参数。检查这个tutorial,习惯lua模式不需要很长时间。
您可能仍然可以使用多种模式解析这些字符串。假设本地名称可以有多个大写和小写字母,^%[(%a+)%s(%d+%.%d+)%]%s
是获得第一部分的最佳方法。要匹配参数,请在输入的某些部分上运行多个模式,例如<%s*>
或<(%w+)>
,以单独检查每个参数。
或者获取一个正则表达式库或解析器,这在这里会更有用。
答案 1 :(得分:1)
Lua模式确实有限,但如果你能做出一些假设,你可以绕过。就好如果参数中没有&gt;,你可以遍历所有匹配的&lt;&gt;对:
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说的那样。