* 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. |
間違いだらけの正規表現講座 level 7
れっつ練習!さて、駆け足でやってきましたが、第6回までの説明で、正規表現での検索の基本の部分は押さえたことになります。 次回からは、正規表現の真骨頂、正規表現を使った置換のやりかたを見ていきますが、 ここらで一旦おさらいを兼ねて、検索の練習をしてみましょう。 おさらいまずは、今まで出てきたメタ文字をおさらいしましょう。
レッツチャレンジでは、例題です。試しに、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>」などとすると、最後のリンクは改行が混じっているので マッチできませんね。 仕方ないので、シングルラインモード(「.」が改行にもマッチする)を チェックして試してみると、今度は、4つのリンクが全部いっぺんにマッチして しまった筈です。 これは、第3回でちらっと述べた、「最長一致の法則」、別名「欲張りなマッチ」 という仕様が関係しています。 「.*」は、マッチできる限り最長の文字列にマッチしようとします。 「.」が改行にマッチしない場合(シングルラインモードOFF)であれば、 「.*」は改行のところで有効範囲が切れるのですが、 「.」が改行にマッチするようにすると、 何行も何行も延々とマッチし続けてしまうのですね。 つまり、 このような場合に使うのが、「最短一致」です。 「*」「+」の後に「?」をつけると、その場合だけ、「*」「+」は、「可能な限り最短の文字列にマッチ」するようになります。 シングルラインモードONの状態で、「<a.*?/a>」で検索して試してみてください。 今度は上手く行く筈です。 この場合、 というわけで、メタ文字の一覧に追加です。
なお、「*」「+」だけでなく、量指定子と呼ばれる、繰り返しを指定する メタ文字であれば、その後ろに「?」をつけることにより、最短一致に することができます。 ちょっと脱線さて、本文中、いきなり「欲張り」とか言い出してふざけてると思ったのではないでしょうか。 コンピュータの専門用語、特にUNIX系の用語って、プロセスを殺したり(kill)、 プロセスがゾンビ(zombie process)になったり、OSがあわてふためいたり(panic)、 茶目っ気のあるというか、コンピュータを擬人化したものが多いですね。 プログラムをしていると、そういう言葉を使うのは良く分かります。 開発の現場にいると、 この子があっちのサーバにリクエストを投げます。もしサーバがダンマリだったり 死んでたりしたら、仕方ないのでDBを見に行って別のサーバに投げなおします。 なんて発言は日常茶飯事、だれも気にせず使っていますが、 このプロセスがあっちのサーバにリクエストを送信します。もしサーバがレスポンスを 返さなかったり、サーバが起動していなかったりしたら、データベースを検索して、 別のサーバに送信しなおします。 というのが正しい日本語ですよね。 ご指摘などはこちらへ |