【问题标题】:Lua string.match wrong pattern?Lua string.match 错误的模式?
【发布时间】:2018-02-03 16:09:50
【问题描述】:

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

【问题讨论】:

    标签: string split lua


    【解决方案1】:

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

    有几种方法。这里有两个:

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

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

    查看online demo打印

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

    详情

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

    【讨论】:

    • 第一个可以在我的电脑上运行,但是带有 $ 符号的第二个仍然无法运行。谢谢你的解释。
    • @A.G.很高兴第一个工作。这很奇怪,我希望反之亦然,因为 .- 即使在里面有转义引号的情况下也可以工作。
    • @A.G.顺便说一句,如果我的回答对你有帮助,请考虑也支持这个答案。
    猜你喜欢
    • 2013-12-10
    • 2011-11-05
    • 2013-06-04
    • 2011-10-31
    • 2015-07-20
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多