为什么lua的字符串模式匹配呢?

Rec*_*als 4 windows winapi lua lua-patterns

我有一个监控CPU和GPU温度的外部应用程序......

我正在使用Lua和外来扩展来获取这些值(通过GetWindowText)并对这些值进行一些模式匹配,有效地从字符串中提取温度数字,默认情况下显示为CPU 67.875 °C......
但也许我对于LUA中的模式如何工作有错误的想法(因为它们看起来不像正则表达式)?

我使用的模式[%d]+[.%d+]*应该匹配0到100.0之间的任何数字,对吗?
奇怪的是,当值达到56.5度左右时,我得到了令人难以置信的奇怪输出(见链接).

为什么会这样?
如何以0到100之间的格式提取正确的浮点值(作为字符串)XYY.ZZZ,其中X不是可选的,Y是可选的,.除非Z存在,否则是可选的?

lhf*_*lhf 5

您正在看到累积舍入误差的影响,因为0.16无法在浮点中精确表示.以下代码表现更好:

local n = 0
while n < 10000 do
    local s = tostring(n/100)
    local t = s:match("[%d]+[.%d+]*")
    print(t)
    n = n + 16
end
Run Code Online (Sandbox Code Playgroud)

现在,针对您的问题,请尝试以下更简单的模式:

s="CPU 67.875 °C"
print(s:match("CPU +(.-) +"))
Run Code Online (Sandbox Code Playgroud)

  • @NicolBolas - 1)在大多数正则表达式中,元字符"可能不会"甚至"不能"在类中转义.2)我猜,lhf是(http://www.lua.org/authors.html)照片中的三个人中的一个,即看起来最聪明的人:-)你真的想争辩吗?和他一起谈谈Lua的工作原理? (4认同)
  • @RectangleEquals,参见[浮点指南 - 每个程序员应该知道的关于浮点运算的内容](http://floating-point-gui.de/). (2认同)