Archive for 2010年12月3日|Daily archive page

newLISP で GUI する。。。または、天気予報を表示する。(解説編)

 “newLISP で GUI する。。。または、天気予報を表示する。”を出してからだいぶ経ちますが(汗)、如何だったでしょうか?

 “short short story または 晴耕雨読な日々”の WordPress.com の移動に伴う LISPOn newLISP不具合の修正が終わったので、ようやく、こちらを更新できるようになりました(言い訳ですけどね、汗)。

 さて、解説ですが、今回は、鬼門(笑)の正規表現です。
 スクリプト中の関数button-handler

    (regex {<div class="titleBgLong">(([^v]*)*(v+[^>][^v]*)*)</div>} weather 0)

 という部分があります。変数weather には、tenki.jp のソースが入っていて、天気予報の場所と更新時間を取り出しています。
 "<div class="titleBgLong">~</div>" という部分を切り出そうとして、

{<div class="titleBgLong">.*</div>} 

 とすると、複数の "</div>" がある場合、うまくいきません。
 そこで、ここを

{<div class="titleBgLong">(([^v]*)*(v+[^>][^v]*)*)</div>}

 としているのが、今回の肝です。
 この正規表現の中で、

(([^v]*)*(v+[^>][^v]*)*)

 の部分が、"v>" という文字列を含まない文字列にマッチします。
 なぜそうなるのか? 正直に言いましょう、私には判りません(笑)。
 “ある文字列を含まない正規表現”で、自動生成してもらった正規表現です。
 同様に

    (letn (tmp (regex {(<table(([^e]*)*(e+[^>][^e]*)*)*/table>)} weather (+ 2048 4))

 の部分では、"e>" という文字列を含まない、を使って、"<table~/table>" 部分を切り出し天気予報情報自体を取り出しています。
 このように、~という文字列を含まない、という表現を使ったことで格段に文字列の切り出しが楽になりました(笑)。

 以上、如何でしょうか?