Lua string.match错误的模式?

时间:2017-08-25 14:59:58

标签: string split lua

我正在为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错误?

1 个答案:

答案 0 :(得分:0)

没有错误,您的模式包含一个贪婪的.*模式,该模式匹配尽可能多的char。它抓取整个字符串,然后回溯以查看是否有任何其他强制子模式来生成文本。由于"?可以匹配空字符串,因此在捕获后""之后匹配它。

有几种方法可以解决。这是两个:

name, value = expr:match( '^%-%-(.*)="?([^"]*)"?' )

name, value = expr:match( '^%-%-(.*)="?(.-)"?$' )

请参阅online demo打印

found values for '--username="John Doe"'
username = John Doe

<强>详情

  • 第一种方法是使用否定字符类([^"]*)。它匹配除"以外的任何0+字符。因此,它无法匹配上一个"
  • 第二个使用(.-)"?$,一个懒惰的.-(尽可能少地匹配0 +字符,但不包括"(如果存在)字符串的结尾($)。