为什么Lua的字符串模式匹配会这样做?

我有一个外部应用程序,用于监视CPU和GPU温度...

我正在使用带有外星人扩展的Lua(通过GetWindowText捕获这些值(http://msdn.microsoft.com/en-us/library/ms633520%28v=vs.85%29.aspx)),并对这些值进行一些模式匹配,从字符串中提取温度数字,该字符串默认显示为 CPU   67.875 °C...

但也许我对LUA中的模式工作方式有错误的想法(因为它们似乎不完全像正则表达式)?

我使用的模式是[%d]+[.%d+]*,应该匹配在0到100.0之间的任何数字,对吗?

然而,当值达到56.5度左右时,我得到了非常奇怪的输出(请参见链接)。

这是为什么?

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

点赞
用户107090
用户107090

您正在看到积累的舍入误差的影响,因为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

现在回答您的问题,尝试下面更简单的模式:

s="CPU 67.875 °C"
print(s:match("CPU +(.-) +"))
2013-05-16 12:14:25