2010-04-02 2 views
3

저는 사용하는 프로그램에 대한 기상 예보관을 작업 중이며, 대부분 잘 작동합니다. 여기까지 내가 지금까지 가지고있는 것이있다. 합니다 (zs.stuff에 더주의를 기울이없는 즉, 프로그램의 특정와 루아 코딩 아무런 관계가 없습니다.).루아에서 패턴 매칭과 관련된 몇 가지 패턴 매칭 문제

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

+0

위치의 값을 출력하여 if 문 앞에 무엇이 필요한지 확인하십시오. 위치가 빈 문자열이면 "위치가 true"로 평가됩니다. –

+0

고마워요! 사실 내 부분에 오류가 있다는 것을 알았습니다. 잘못된 부분에 if 위치 부분이있었습니다. 나는 그 위치를 연결 한 인쇄물 ("정보 수집 ...") 앞에 놓아야했다. 나는 여기에서 나머지를 얻을 수 있다고 생각한다. 모든 도움을 주셔서 감사합니다! – Josh