Lua中模式匹配的几个模式匹配问题

时间:2010-04-02 22:20:00

标签: lua lua-patterns

我一直在为我使用的程序做天气预报工作,而且它在很大程度上运行良好。这是我到目前为止所拥有的。 (不要理会zs.stuff。这是特定于程序的,与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">&LT; img src =“http://icons-ecast.wxug.com/i/c/a/[%w_]+.gif”
它完美匹配条件。 (无论出于何种原因,我无法正确显示上面的行,但是`&lt;和img)之间没有空格

有谁可以指出它有什么问题?除了模式匹配,我向你保证这条线是从网页逐字逐句的。

我遇到的另一个问题是能够匹配换行符。有没有办法做到这一点?我问的原因是因为在同一页面上,我需要匹配的一些内容在不同的行上分解,因为我想要匹配的实际模式显示在页面的其他位置,我需要能够匹配换行符以获得确切的模式。

1 个答案:

答案 0 :(得分: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

对于多线,这不应该是一个问题,换行只是控制字符,如果你在多行中读到相同的字符串,这个匹配就可以了。