如何捕捉&;Lua中长命令行参数的模式匹配?

如何捕捉&;Lua中长命令行参数的模式匹配?,lua,Lua,我想像这样解析长命令行参数 --键=值 --键\名称=值\值 --关键字名称=值 其中,键名称和值可以包含下划线或破折号,也可以同时包含下划线和破折号 任何不匹配的内容都应跳过 这就是我目前所拥有的 local args = {...} for i = 1, #args, 1 do print("arg[i]=", args[i]) local string = args[i] local k,v = string:match("%-%-([^=-]+)=([^=]+)"

我想像这样解析长命令行参数

--键=值 --键\名称=值\值 --关键字名称=值

其中,键名称和值可以包含下划线或破折号,也可以同时包含下划线和破折号 任何不匹配的内容都应跳过

这就是我目前所拥有的

local args = {...}
for i = 1, #args, 1 do   
   print("arg[i]=", args[i])
   local string = args[i]
   local k,v = string:match("%-%-([^=-]+)=([^=]+)")
   print("k=", k)
   print("v=", v)
end
它在一定程度上起作用,但也与--key_name=value匹配 i、 e.3破折号


我做错了什么?

你没有强迫匹配在你的论点开始时发生,所以它很高兴跳过前导的
-
并匹配论点的其余部分

对脚本进行小的修改,以独立运行并捕获比赛开始的位置:

for i = 1, #arg, 1 do
    print("arg[i]=", arg[i])
    local string = arg[i]
    local p,k,v = string:match("()%-%-([^=-]+)=([^=]+)")
    print("p=", p)
    print("k=", k)
    print("v=", v)
end
运行
/script.lua---fook=foov--bark=barv
输出:

arg[i]= ---fook=foov
p=      2
k=      fook
v=      foov
arg[i]= --bark=barv
p=      1
k=      bark
v=      barv
与之相比:

for i = 1, #arg, 1 do
    print("arg[i]=", arg[i])
    local string = arg[i]
    local p,k,v = string:match("^()%-%-([^=-]+)=([^=]+)")
    print("p=", p)
    print("k=", k)
    print("v=", v)
end
输出(对于相同的
/script.lua---fook=foov--bark=barv
):

另外,对于记录
string
是一个糟糕的变量名称,因为您刚刚删除了默认的
string
函数表

arg[i]= ---fook=foov
p=      nil
k=      nil
v=      nil
arg[i]= --bark=barv
p=      1
k=      bark
v=      barv