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



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

-

-键=值--key_name=value_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 匹配即 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):

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

同样为了记录string变量来说是一个糟糕的名字,因为你刚刚破坏了默认的string函数表。

最新更新