【问题标题】:Why is lua's string pattern matching doing this?为什么 lua 的字符串模式匹配会这样做?
【发布时间】:2013-05-11 07:22:15
【问题描述】:

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

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

我使用的模式是 [%d]+[.%d+]*,它应该匹配 0 到 100.0 之间的任何数字,对吗?
然而奇怪的是,当值达到 56.5 度左右时,我是 getting incredibly strange output(见链接)

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

【问题讨论】:

    标签: windows winapi lua lua-patterns


    【解决方案1】:

    您会看到累积舍入误差的影响,因为 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 +(.-) +"))
    

    【讨论】:

    • 好吧,我认为这只是某种数学竞赛条件......但这仍然不能解释 为什么 它决定中途发疯,并继续前进无穷大。
    • @RectangleEquals:请注意,虽然您的模式与此无关(您可以打印出s 并看到相同的内容),但您的模式也是错误的。您需要转义.,并仅在第二个子句中检查一个[%d]+%.?[%d]*。否则,您可以像解析“10.45”一样简单地解析“10aaaaa4bdcedd5”。
    • @NicolBolas,你不需要在课堂上转义.
    • @NicolBolas - 1) 在大多数正则表达式风格中,元字符 may not 甚至 must not 在类中被转义。 2) 我猜,lhf 是that 照片上的三个男人之一,也就是最聪明的那个:-) 你真的想和他争论 Lua 是如何工作的吗?
    猜你喜欢
    • 2021-06-07
    • 2011-03-29
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2013-10-13
    • 2016-06-27
    相关资源
    最近更新 更多