2010-04-02 92 views
3

我一直在爲我使用的程序開發一款天氣預報器,並且它在大多數情況下運行良好。這是我到目前爲止。 (不注意的zs.stuff也就是說程序具體和對Lua的編碼沒有關係。)一對模式匹配問題與模式匹配在Lua

if not http then http = require("socket.http") end 

local locale = string.gsub(zs.params(1),"%s+","%%20") 
local page = http.request("http://www.wunderground.com/cgi-bin/findweather/getForecast?query=" .. locale .. "&wuSelect=WEATHER") 
local location = string.match(page,'title="([%w%s,]+) RSS"') 
--print("Gathering weather information for " .. location .. ".") 
--local windspeed = string.match(page,'<span class="nobr"><span class="b">([%d.]+)</span>&nbsp;mph</span>') 
--print(windspeed) 
local condition = string.match(page, '<td class="vaM taC"><img src="http://icons-ecast.wxug.com/i/c/a/[%w_]+.gif" width="42" height="42" alt="[%w%s]+" class="condIcon" />') 
--local image = string.match(page, '<img src="http://icons-ecast.wxug.com/i/c/a/(.+).gif" width="42" height="42" alt="[%w%s]+" class="condIcon" />') 
local temperature = string.match(page,'pwsvariable="tempf" english="&deg;F" metric="&deg;C" value="([%d.]+)">') 
local humidity = string.match(page,'pwsvariable="humidity" english="" metric="" value="(%d+)"') 
zs.say(location) 
--zs.say("image ./Images/" .. image .. ".gif") 
zs.say("<color limegreen>Condition:</color> <color white>" .. condition .. "</color>") 
zs.say("<color limegreen>Temperature: </color><color white>" .. temperature .. "F</color>") 
zs.say("<color limegreen>Humidity: </color><color white>" .. humidity .. "%</color>") 

我的主要問題是:我改變了「狀況」,並增加了「形象」變量到他們現在的樣子。即使它應該匹配的行直接來自網頁,但它根本無法匹配。所以我想知道我錯過了什麼是阻止這些代碼工作。如果我拿出
<td class="vaM taC"> < img src =「http://icons-ecast.wxug.com/i/c/a/[%w_]+.gif」
它會完美地匹配條件。 (無論出於何種原因,我無法正確顯示上面的行,但在<和img之間沒有空格)

任何人都可以指出它有什麼問題嗎?除了模式匹配之外,我向你保證該行在網頁上是逐字的。

我的另一個問題是跨越換行符匹配的能力。有沒有可能的方法來做到這一點?我之所以問,是因爲在同一頁面上,我需要匹配的部分內容分成不同的行,並且由於我想要匹配的實際模式顯示在頁面上的其他位置,所以我需要能夠跨越換行符匹配以獲得確切的模式。

回答

1

您可以大大簡化你的對手(見下文),但一般它看起來像你有兩個問題...

  • 缺少的()各地要抓住比賽。
  • 你需要逃避。使你的比賽中的字符變成%。

我想這和它的工作...

local page = [[<td class="vaM taC"><img src="http://icons-ecast.wxug.com/i/c/a/hello_world.gif" width="42" height="42" alt="HELLO WOLRD" class="condIcon" />]] 
local condition, image = string.match(page, '.+/([%w_]+)%.gif".+alt="([%w%s]+)".+') 
print(condition, image) 

這種印刷...

hello_world HELLO WORLD 

爲多,這不應該是一個問題,新行只是控制字符,如果你在多行讀入相同的字符串,這個匹配的作品。

+0

非常好!它總是有助於擁有一個全新的眼睛。謝謝! 但是,我遇到了另一個問題,我似乎也無法解決這個問題。 如果位置再 做zs.say的東西在這裏 其他 打印(「未找到位置!」) 結束 我似乎無法得到那個工作。我想要它做的是如果找不到我的位置通知我的錯誤。但是,無論我如何做,它似乎都會繞過它,完全忽略if語句。不過,我認爲這是我錯過的另一件事。再次感謝幫助! – Josh 2010-04-02 23:17:16

+0

嘗試打印位置的值以驗證它是您的if語句之前的期望值,如果位置爲空字符串,則「if location」將評估爲true – 2010-04-02 23:34:42

+0

謝謝!我實際上發現這是我的錯誤 - 我在錯誤的部分中有if位置部分。我應該在打印之前(「收集信息...」)在連接位置的地方放置它。我想/我現在可以從這裏得到休息。感謝你的幫助! – Josh 2010-04-03 00:11:15