我想解析像这样的长命令行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个破折号。
我做错了什么?
答案 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
函数表。