首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lua中模式匹配的几个模式匹配问题

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

Stack Overflow用户
提问于 2010-04-03 06:20:00
回答 1查看 1.1K关注 0票数 3

我一直在为我使用的一个程序开发天气预报器,大部分情况下,它都运行得很好。这是我到目前为止所拥有的。(请不要注意zs.stuff。这是特定于程序的,与Lua编码无关。)

代码语言:javascript
复制
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>")

我的主要问题是:我更改了“条件”,并将“image”变量添加到它们现在的位置。即使它应该匹配的行直接来自网页,它也根本无法匹配。所以我想知道是什么让我错过了阻止这段代码工作的东西。如果我拿出

<td class="vaM taC">< img src="http://icons-ecast.wxug.com/i/c/a/[%w_]+.gif

它将完美地匹配条件。(由于某种原因,我无法正确显示上面这行代码,但是`<和img之间没有空格)

有人能指出它的问题所在吗?除了模式匹配之外,我向你保证,这行是从网页逐字。

我遇到的另一个问题是跨行换行的匹配能力。有没有可能做到这一点?我问这个问题的原因是,在同一页上,我需要匹配的一些内容被分开在不同的行上,而且由于我想要匹配的实际模式显示在页面的其他位置,所以我需要能够进行换行匹配以获得确切的模式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-04-03 06:46:03

你可以大大简化你的匹配(见下文),但总的来说,你似乎有两个问题……

  • 缺少您要捕获的匹配项周围的()。
  • 你需要转义。将匹配的字符设置为%。

我试过了,它起作用了。

代码语言:javascript
复制
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)

这是打印的..。

代码语言:javascript
复制
hello_world    HELLO WORLD

至于多行,这应该不是问题,换行符只是控制字符,如果您将多行读入同一字符串,则此匹配将起作用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2569496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档