開発ブログ

WWWクリエイターズが送る、Git、CSS、HTML、コマンドライン、Macの便利機能など、開発に関する役立ち情報発信します。気まぐれに更新。

正規表現:「行頭」「行末」の表現と、応用パターン。

最終更新:2017-09-07 by Joe

正規表現の基本、行頭(行の一番最初)と行末(行の一番最後)を表す表現です。

行頭を表す正規表現

行頭は「^(キャレットと読みます)」によって、その位置をマッチできます。

下記は、は「わたしは」で始まり「。」まで続く、空白以外の文字列をマッチします。

空白以外の文字列は「.(ドット)」で表現され、量指定子の「*」は0か、1つ以上の連続を表します。

ところで、「^」は「文字」をマッチするのではなく「位置」をマッチ事に注意して下さい。このような表現は「位置指定子」と呼ばれます。

最長一致と最短一致

上記を使って下記を吟味します。

「わたしは、生まれも育ちもアメリカです。これまであまり海外には行ったことがないので、できれば、ヨーロッパに行ってみたいです。一番フランスに行きたいです。」

これは、案の定、上記の全文(わたしは・・・・・フランスに行きたいです。)をマッチします。 正規表現は、デフォルトでは「最長一致(Greedy matchingと呼ばれます)」となりますので、このマッチングは仕様どおりです。

なお、「わたしは、・・・アメリカです。」という最初の一文だけをマッチしたいとき、そのような表現にするには「最短一致(Non-greedy matching)」を探す必要があります。

最短一致を探すには、両指定子「*」に「?」を組み合わせます。

最短一致に関しては、こちらのリンクもぜひご覧ください

 

行末を表す正規表現

さて、行末を表す位置指定子は「$」です。

「フランスに行きたいです。」で終了する文字列を探してみます。

うまくいきました。

ただ、さきほどの例と同様、案の定すべての文字列をマッチしてしまいます。

「わたしは、生まれも育ちもアメリカです。これまであまり海外には行ったことがないので、できれば、ヨーロッパに行ってみたいです。一番フランスに行きたいです。」

最後の一文をマッチしてみる

すべての文字列でなく「フランスに行きたいです。」で終了する一文をマッチするように書き換えます。

これでどうでしょうか?

これはうまく行きません。このようなケースには工夫が必要です。

下記は「否定の文字クラス」を利用した例です。最後の文を、文字クラスと量指定子を利用して「。」を含まない文字の連続列、という条件で、直前の句読点の直後までの文字列を探し出します。

うまくいきました。

位置指定子について

補足です。

文頭、文末をあらわす「^」「$」は、いずれも「位置」を限定し、それ自体は文字をマッチングしません。それ故、これらは「位置指定子」と呼ばれます。

位置指定子には、他に、下記のような物があります。

  • 肯定先読み  〜 (?= 文字列)
  • 肯定戻り読み 〜 (?<= 文字列)
  • 否定先読み  〜 (?! 文字列)
  • 否定戻り読み 〜 (?<= 文字列)

いまは、なんなくこんな方法があるんだなーというくらいに覚えておくと良いと思います。きっと近い将来、いつか役に立つでしょう。

いちおう、利用例をあげておきます。

「フランス」を含む一文をマッチ

少しトリッキーですね。1分が「。の直後から。まで」という前提です。

下記の記事で、正規表現の「否定」表現についてまとめています。記事の後半で「否定先読み」をフィーチャしています。