String Lua字符串匹配问题?

String Lua字符串匹配问题?,string,lua,string-matching,String,Lua,String Matching,如何将以下字符串与一个表达式匹配 本地a=“[a 1.001523]” 本地b=“[b 2.68]” 本地c=“[b 2.68]” 本地d=“[b 2.68]” 本地名称,netTime,argument1,argument2,argumentX=string:match(?) --(字符串是a或b或c或d) 问题是,字符串可以有不同数量的参数(“”),参数中可以有数字、字符、特殊字符或空格。 我是Lua的新手,我必须学习字符串匹配,但我不能在几个小时内学会。我问你,因为我明天需要结果,我真的很

如何将以下字符串与一个表达式匹配

本地a=“[a 1.001523]<?0>”

本地b=“[b 2.68]”

本地c=“[b 2.68]”

本地d=“[b 2.68]<><?>”

本地名称,netTime,argument1,argument2,argumentX=string:match(?)

--(字符串是a或b或c或d)

问题是,字符串可以有不同数量的参数(“”),参数中可以有数字、字符、特殊字符或空格。 我是Lua的新手,我必须学习字符串匹配,但我不能在几个小时内学会。我问你,因为我明天需要结果,我真的很感激你的帮助


干杯:)

Lua模式非常有限,不能有替代表达式,也不能有可选组。这意味着所有参数都需要与相同的表达式匹配,如果只编写一个模式,则需要使用固定数量的参数。检查这个,很快就会习惯lua模式

您可能仍然能够使用多种模式解析这些字符串<代码>^%[(%a+)%s(%d+%。%d+)%]%s是获取第一部分的最佳方法,假设本地名称可以有多个大写和小写字母。要匹配参数,请对输入的部分运行多个模式,如
,以分别检查每个参数


或者获得一个正则表达式库或解析器,这在这里会更有用

Lua模式确实是有限的,但是如果你能做出一些假设,你可以绕开它。例如,如果参数中没有>,则可以循环所有匹配的参数对:

local a=“[a 1.001523]<?0>”
本地b=“[b 2.68]”
本地c=“[b 2.68]”
本地d=“[b 2.68]<><?>”
函数解析(str)
本地名称,nettime,lastPos=str:匹配“%[(%a+)%s(%d+%。%d+)%]()”
局部参数={}
--仅在[]中的初始部分之后开始查找参数
对于str:sub(lastPos+1)中的参数:gmatch(“(%b)”do
参数=参数:子(2,-2)--条带
--你需要什么就做什么。我们把它放在桌子上
参数[#参数+1]=参数
结束
返回名称、nettime、解包(参数)
结束
对于更复杂的事情,你最好使用像卡普说的那样的东西

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