首页 > 解决方案 > Lua 模式匹配数字格式并且不捕获较早的数字

问题描述

我想从xrandr -q. 具体来说,这些数字的格式为xx.xxor xxx.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)")where 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

解决方案


你的模式太复杂了。

分辨率:`"%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

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


推荐阅读