2013-05-16 90 views
4

我有監視CPU和GPU的溫度的外部應用程序...
爲什麼lua的字符串模式匹配這樣做?

我使用的Lua與alien extension抓住這些值(通過GetWindowText)和做一些圖案這些值匹配,有效地提取溫度數字出了字符串,默認顯示爲類似CPU 67.875 °C ...
但是也許我對LUA中的模式工作有錯誤的想法(因爲它們看起來不像正則表達式)?

我使用的模式是[%d]+[.%d+]*,它應該匹配0到100.0之間的任何數字,對嗎?
奇怪的是,當數值達到大約56.5度時,我是getting incredibly strange output(見鏈接)

這是怎麼發生的?
我怎樣才能提取0和100之間的格式爲XYY.ZZZ,其中X不是可選的,Y是可選的,.是可選的,除非Z存在的正確的浮點值(作爲字符串)?

回答

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 

,你的問題,請嘗試以下簡單的模式:

s="CPU 67.875 °C" 
print(s:match("CPU +(.-) +")) 
+0

好吧,我想這只是各種各樣的數學競賽條件......但是,這仍然沒有解釋爲什麼它決定在半途中瘋狂,並繼續向無窮大發展。 – RectangleEquals

+2

@RectangleEquals,請參閱[浮點指南 - 程序員應瞭解的浮點算法](http://floating-point-gui.de/)。 – lhf

+0

@RectangleEquals:請注意,雖然你的模式與此無關(你可以打印'''並且看到相同的東西),你的模式也是錯誤的。您需要轉義'.',並且只在第二個子句中檢查其中的一個*:[%d] +%。?[%d] *'。否則,您可以像「10.45」一樣輕鬆地解析「10aaaaa4bdcedd5」。 –

相關問題