如何捕获&模式匹配Lua中的长命令行args?

时间:2014-11-19 01:57:58

标签: lua

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

- 键=值 --key_name = value_value --key名=值值

其中键名和值可以包含下划线或短划线或两者 应该跳过任何不匹配的东西。

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

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个破折号。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

你并没有强迫比赛在你的论点开始时发生,所以它很乐意跳过一个前导-并匹配其余的论点。

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

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函数表。