# 3.2. 例:

1. すべての boren を boren から BoreN に変換したい

        Match: .*
        From: boren
        To: BoreN

   まっすぐ前に進み、すべてのものとマッチし、borenをBoreNに置き換えます。

2. 中にborenを含むすべてのものとマッチさせ、"boren"というウィンドウに送信したい

        Match: boren
        From: ^
        To: ˜boren˜

   "boren"を探し、見つかった場合、その文字列(ˆ)の先頭を ˜boren˜ に置き換えます。

3. #2 の結果、その文字列がすでに `˜somewindow˜` を持っていた場合、2つの `˜boren˜˜somewindow˜...` を持つことになります。その場合、代わりに下記のようにできます。

        Match: boren
        From: ^(?:˜\S+˜)
        To: ˜boren˜

   見たとおり、from行がやや複雑になっています。これは、 "`˜\S+˜`"の0個または1個のコピーとのマッチを指定します。つまり、1個のチルド、1個以上の非ホワイトスペース、その後にもう1個のチルドです。しつこく言えば、 `(*:˜\S+˜)`は、 0個または1個以上のチャネル・ディレクティブのマッチを指定しており、この場合、前の規則は壊されます。

4. Server killメッセージが出て、その後、長いおもしろくないものがだらだら続きます。 dalnetでの基本メッセージは下記のようなものです。

        *** Notice -- Received KILL message for BOBO!ANDY@line82-basel.datacomm.ch
        from NickServ Path: empire.ny.us.dal.net[209.51.168.14]!trapdoor.ca.us.dal
        .net[206.86.127.252]!caris.ca.us.dal.net[208.1.222.221]!services.dal.net[2
        008.1.222.222]!services.dal.net (NickServ Enforcement)

   このようなメッセージが大量に出た場合、画面を飛んで流れるメッセージすべてを見たくないでしょう。1度に1ビットずつそれらを処理するために、3つの規則を作成します。これをもっと少ない規則で行うこともできますが、これは基本的規則構造を分かりやすいステップで示そうというものであり、複数の規則を使用してメッセージを解析する方法を示しています。最初のステップはメッセージのPath:部分を削除することで、例4になります。

        Match: ^\*\*\*.* KILL message for.*
        From:  Path: \S+
        To: .

   Matchは、 `***`で始まるメッセージを探します。 *は、単独では直前の文字の0個または1個以上を意味するので、\をつけて引用にする必要があります。 `.*` は、 `" KILL message for"` を見つけるまでのすべてのものとのマッチを意味します。これにより、 `-- Received...` などに連結するのを避けることができます。末尾の `.*` は、行の最後までのすべてのものとのマッチを指定します。（必須ではないと思う）

   From は、スペース、Path:、スペース、およびホワイトスペースでないすべての文字をToに置き換えることを指定します。To は `"."` なので、パス全体が1個のピリオドに変わります。

   これでメッセージは下記のようになります。

        *** Notice -- Received KILL message for BOBO!ANDY@line82-basel.datacomm.ch
        from NickServ. (NickServ Enforcement)

   `NickServ` の後の新しい `"."` に気づきましたか?

5. これでメッセージはだいぶ簡潔になりましたが、NickServeからのKILLは実際には重要でないので、これらを `!discard` ウィンドウに転送することにしましょう。

        Match: ^\*\*\*.*KILL message.*\(NickServ Enforcement\)
        From: ^(?:˜\S+˜)
        To:  ˜!discard˜

   Match規則は、KILLメッセージを探し、NickServからのメッセージであることを確認します。 `\(` と `\)` に注目してください。 2個の `()` は 正規表現(regular expressions) で使用されているので、 引用にする必要があります。これは例3と非常によく似ています。

6. これで、NickServのKILLをすべてふるい出しましたが、メッセージはまだ一目で読みやすいものではありません。 そこで、下記のように並べ替えてみましょう。

        *** [KILL] <KILLER> killed <KILLED> (reason)
        Match: \*\*\*.*KILL message
        From: \*\*\*.*for (.*?) from (.*?)\. \((.*?)\).*
        To: *** [KILL] $$2 killed $$1 ($$3)

   このmatchは、 `***<something>` KILL message を探します。 さっき末尾に`˜<window>˜` を追加しているかも知れないので、`ˆ`は使用できません。

   from行は、あまり面白いものではありません。 `"for (.*?) "` は、forという単語の後に何かのテキストが付いているものを探します。 `.*?` は、改行以外の0個または1個以上の何かとのマッチを探しますが、必須ではありません。最初の終了条件が見つかると、最後でなくても停止します。つまり、これはスベースまでのすべてのものとマッチします。囲んでいる `()` は、内容を保存することを指定します。 各 () は、マッチしたデータを `$#` に保存します。 ここで `#` は最初の文字列を1として、順に大きくなります。この場合、 `$1` には、KILLされた人のニック／ユーザ情報が入ります。 `$2` にはKILLした人の名前が入ります。 `()` の間にKILLの理由があります。ここで、 `(` と `\(` はやや混乱を招きそうです。 `\(` は実際の文字 `'('` とマッチすることを忘れないでください。

7. 生活をカラフルにする方法です。KSircにカラーを付けたいとします。カラー情報については、 色の章 を見てください。ここでは、各行で `<NICK>` の間のニックを強調するためのフィルター規則を示します。

        Match: ^(?:˜\S+˜)<\S+>
        From: <(\S+)>
        To: <˜4$$1˜c>

   ニックを取り出し、2個の `<>` の間にカラー番号4を追加します。 `˜c`はカラーをクリアします。