【问题标题】:Lua pattern matching a number format and not capturing earlier numbersLua 模式匹配数字格式并且不捕获较早的数字
【发布时间】:2020-01-21 07:28:56
【问题描述】:

我想从xrandr -q 捕获分辨率和刷新率输出。具体来说,这些数字的格式为xx.xxxxx.xx,其中小数点后总是有 2 个数字,但有时也有 2 或 3 个数字。我想单独捕获每个值以便能够存储它们以供以后使用。

4 行典型的命令输出如下所示:

   3440x1440     59.97 +  99.98*   49.99  
   2560x1440     59.95  
   2560x1080     60.00    59.94  
   1920x1080     60.00    59.94    50.00 

我已经能够使用string.match(xrandr[i], "^.-%s(%d.-x.-%s)") 获得分辨率,其中 xrandr 是一个包含每行命令输出的数组。我目前单独获取刷新率的尝试如下所示:string.gmatch(xrandr[i], "%s.-(%d.-%..-%d%d)")。这几乎可以工作,但是对于每个分辨率,它都会同时捕获分辨率和第一个刷新率,然后分别捕获任何后续。当我尝试打印有意捕获的分辨率及其每个支持的刷新率时,它看起来像这样:

3440x1440 
3440x1440     59.97
99.98
49.99
2560x1440 
2560x1440     59.95

捕获分辨率的位置,但随后以第一个刷新率再次捕获。相反,我想得到这个:

3440x1440 
59.97
99.98
49.99
2560x1440 
59.95

那么我怎样才能避免重新捕获分辨率,同时还单独获得每个刷新率?

【问题讨论】:

    标签: lua


    【解决方案1】:

    你的模式太复杂了。

    分辨率:`"%d+x%d+"

    %d 任意数字

    %d+ 一位或多位数字

    x 字符 x

    刷新率:"%d+%.%d+"

    %. 一个点(转义魔术字符.%,否则. 表示任何字符)

    一口气:

    local a = "1234x5678 12.34 56.78"
    
    for match in a:gmatch("[0-9x.]+") do print(match) end
    

    [0-9x.] 是一类字符。它匹配任何出现的数字 09.x

    所以"[0-9x.]+" 匹配任何可能还包含.x 的数字序列

    【讨论】:

    • 效果很好,谢谢。我想 15 分钟的阅读文档并没有太大帮助,但你能解释一下这些模式到底在做什么吗?
    • @Raspberry-Jam 我建议阅读此页面,fhug.org.uk/wiki/wiki/…
    猜你喜欢
    • 1970-01-01
    • 2017-01-08
    • 2013-06-10
    • 1970-01-01
    • 2014-11-10
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    相关资源
    最近更新 更多