我正在为Lua编写命令行解析器,我想使用Lua string.match()提取选项的名称及其值。
命令行选项定义为: - name = value
以下是我使用的代码(可以找到here):
local expr = '--username=John'
local name, value = expr:match( '^%-%-(.*)=%"?(.*)%"?' )
print( "found values for '" .. expr .. "'" )
print( name .. " = " .. value )
输出没问题:
found values for '--username=John'
username = John
但如果我想设置一个带空格的值,我将它括在双引号
之间local expr = '--username="John Doe"'
local name, value = expr:match( '^%-%-(.*)=%"?(.*)%"?' )
print( "found values for '" .. expr .. "'" )
print( name .. " = " .. **value )
输出不是我想要的,因为上一个双引号已由 string.match()提取
found values for '--username="John Doe"'
username = John Doe"
我的模式错了还是Lua错误?
答案 0 :(得分:0)
没有错误,您的模式包含一个贪婪的.*
模式,该模式匹配尽可能多的char。它抓取整个字符串,然后回溯以查看是否有任何其他强制子模式来生成文本。由于"?
可以匹配空字符串,因此在捕获后"
和"
之后匹配它。
有几种方法可以解决。这是两个:
name, value = expr:match( '^%-%-(.*)="?([^"]*)"?' )
或
name, value = expr:match( '^%-%-(.*)="?(.-)"?$' )
请参阅online demo打印
found values for '--username="John Doe"'
username = John Doe
<强>详情
([^"]*)
。它匹配除"
以外的任何0+字符。因此,它无法匹配上一个"
(.-)"?$
,一个懒惰的.-
(尽可能少地匹配0 +字符,但不包括"
(如果存在)字符串的结尾($
)。