Lua のパターン マッチングに関するいくつかのパターン マッチングの問題

StackOverflow https://stackoverflow.com/questions/2569496

  •  24-09-2019
  •  | 
  •  

質問

私は自分が使用しているプログラムの気象予報士に取り組んでいますが、ほとんどの場合、うまく機能しています。これが私がこれまでに持っているものです。(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>")

私の主な問題はこれです:「条件」を変更し、「画像」変数を現在のものに追加しました。一致するはずの行が Web ページから直接取得されているにもかかわらず、まったく一致しません。それで、このコードの動作を妨げているものは何なのか疑問に思っています。取り出したら
<td class="vaM taC">< img src="http://icons-ecast.wxug.com/i/c/a/[%w_]+.gif"
完璧に状態に一致します。(何らかの理由で、上記の行を正しく表示できませんが、`< と img の間にスペースがありません)

誰かがそれのどこが間違っているのか指摘できますか?パターン マッチングは別として、この行は Web ページからそのまま引用したものであることを保証します。

もう 1 つの疑問は、改行をまたいで照合する機能についてです。これを行う可能な方法はありますか?私が尋ねる理由は、同じページ上で、照合する必要があるもののいくつかが別々の行に分割されており、照合したい実際のパターンがページ上の別の場所に表示されているためです。改行をまたいで照合して正確なパターンを取得できるようにするためです。

役に立ちましたか?

解決

試合を大幅に簡略化することはできますが (以下を参照)、一般的に 2 つの問題があるように見えます...

  • キャプチャしたい試合の周囲の () がありません。
  • をエスケープする必要があります。一致する文字を % にすることで、

これを試してみたらうまくいきました...

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

複数行については問題ありません。改行は単なる制御文字であり、同じ文字列に複数行を読み込んだ場合、この一致は機能します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top