如何在Lua中捕获和匹配长命令行参数?

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

--key=value --key_name=value_value --key-name=value-value

其中 key name 和 value 可以包含下划线、破折号或两者都有 任何不匹配的内容都应该被跳过。

这是我到目前为止所拥有的

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 即三个连字符。

我做错了什么?

点赞
用户258523
用户258523

你没有强制匹配在参数开始处发生,因此它会快乐地跳过前导的 -,并匹配参数的其余部分。

对你的脚本进行小修改,以便独立运行并捕获匹配开始的位置:

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 下输出:

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

另外,记录一下,将变量命名为 string 是一个糟糕的做法,因为它会覆盖默认的 string 函数表。

2014-11-19 02:04:56