* U K I Y A H O N P O * Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura, che la diritta via era smarrita. |
正規表現講座/7 のバックアップの現在との差分(No.3)れっつ練習!さて、駆け足でやってきましたが、第6回までの説明で、正規表現での検索の基本の部分は押さえたことになります。 さて、駆け足でやってきましたが、第6回までの説明で、正規表現での検索の基本の部分は押さえたことになります。 次回からは、正規表現の真骨頂、正規表現を使った置換のやりかたを見ていきますが、 次回からは、正規表現の真骨頂、正規表現を使った置換のやりかたを見ていきますが、 ここらで一旦おさらいを兼ねて、検索の練習をしてみましょう。 おさらいまずは、今まで出てきたメタ文字をおさらいしましょう。
例題レッツチャレンジでは、例題です。HTMLのようなもの。 では、例題です。試しに、HTMLのようなものの検索をしてみましょう。正規表現テスターを立ち上げ、以下の文章をコピペして、チャレンジしてみてください。 上手く行ったら、自分の使っているエディタに正規表現の機能があるかどうか調べ、 そのエディタでも試してみましょう。 なお、正規表現テスターでは、
となっています。 例題#HTMLのようなもの。 #これはコメントです。 <html> <a href="01234.html">電話番号#1="012-3456-7890"</a> <a href="56789.html">電話番号#2="090-0000-0000"</a> <a href="kenokeno.html">へもへも</a> <a href="kenokeno.html">へもへもへも</a> <a href="mononoke.html">ものへも </a> </html>
欲張りなマッチと欲張りでないマッチさて、最後の問題が厄介だったのではないでしょうか。多分、単純に「<a.*/a>」などとすると、最後のリンクは改行が混じっているので さて、最後の問題が厄介だったのではないでしょうか。 単純に「<a.*/a>」などとすると、最後のリンクは改行が混じっているので マッチできませんね。 仕方ないので、シングルラインモード(「.」が改行にもマッチする)を チェックして試してみると、今度は、4つのリンクが全部いっぺんにマッチして 仕方ないので、シングルラインモード(「.」が改行にもマッチする)を チェックして試してみると、今度は、4つのリンクが全部いっぺんにマッチして しまった筈です。 これは、第3回でちらっと述べた、「最長一致の法則」、別名「欲張りなマッチ」 これは、第3回でちらっと述べた、「最長一致の法則」、別名「欲張りなマッチ」 という仕様が関係しています。 「.*」は、マッチできる限り最長の文字列にマッチしようとします。 「.」が改行にマッチしない場合(シングルラインモードOFF)であれば、 「.*」は、マッチできる限り最長の文字列にマッチしようとします。 「.」が改行にマッチしない場合(シングルラインモードOFF)であれば、 「.*」は改行のところで有効範囲が切れるのですが、 「.」が改行にマッチするようにすると、 「.」が改行にマッチするようにすると、 何行も何行も延々とマッチし続けてしまうのですね。 つまり、『「<a」で始まって、改行を含む何文字かがあって、「/a>」で終わる』 最長の文字列を探してしまうわけで、途中に「<a」や「/a>」が含まれていても、 つまり、 『「<a」で始まって、改行を含む何文字かがあって、「/a>」で終わる最長の文字列』 を探してしまうわけで、途中に「<a」や「/a>」が含まれていても、 それは「.*」の一部分と考えられてしまうわけです。 このような場合に使うのが、「最短一致」です。 「*」「+」の後に「?」をつけると、その場合だけ、「*」「+」は、「可能な限り最短の文字列にマッチ」するようになります。 「*」「+」の後に「?」をつけると、その場合だけ、「*」「+」は、「可能な限り最短の文字列にマッチ」するようになります。 シングルラインモードONの状態で、「<a.*?/a>」で検索して試してみてください。 シングルラインモードONの状態で、「<a.*?/a>」で検索して試してみてください。 今度は上手く行く筈です。 この場合、『「<a」で始まって、改行を含む何文字かがあって、「/a>」で終わる』 という最短の文字列を探すので、このような動作になります。 この場合、 『「<a」で始まって、改行を含む何文字かがあって、「/a>」で終わる最短の文字列』 を探すので、このような動作になります。 というわけで、メタ文字の一覧に追加です。 というわけで、メタ文字の一覧に追加です。 こればかりは、実際に例題をやって悩んでみないと存在意味がわからないので、 最後にもってきたのでした。
ちょっと脱線さて、本文中、いきなり「欲張り」とか言い出してふざけてると思ったのではないでしょうか。 コンピュータの専門用語、特にUNIX系の用語って、プロセスを殺したり(kill)、 プロセスがゾンビ(zombie process)になったり、OSがあわてふためいたり(panic)、 茶目っ気のあるというか、コンピュータを擬人化したものが多いですね。 プログラムをしていると、そういう言葉を使うのは良く分かります。 開発の現場にいると、 この子があっちのサーバにリクエストを投げます。もしサーバがダンマリだったり 死んでたりしたら、仕方ないのでDBを見に行って別のサーバに投げなおします。 なんて発言は日常茶飯事、だれも気にせず使っていますが、 このプロセスがあっちのサーバにリクエストを送信します。もしサーバがレスポンスを 返さなかったり、サーバが起動していなかったりしたら、データベースを検索して、 別のサーバに送信しなおします。 というのが正しい日本語ですよね。 ご指摘などはこちらへ |