開発ブログ

Git、CSS、HTML、正規表現など、入門者がつまづきそうなポイントを中心に、役立ち情報発信します。。

正規表現:「行頭」「行末」の表現と、応用例。

最終更新:2018-02-18 by Joe

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

行頭を表す正規表現

正規表現において、行頭は「^」によって、その位置をマッチできます。「^」はキャレット、または、ハットと読みます。

「^」を使った正規表現の例

例えば下記は、「わたしは」で始まり「。」までの文字列をマッチします。

// 行頭のマッチする正規表現
/^わたしは.*。/

なお、正規表現における、「.(ドット)」は空白以外の文字を表し、「*」は、直前のパターンの0回以上の連続(上記の例では「*」の連続)を表します。「^」は何らかの文字をマッチするのではなく「位置」をマッチ事に注意して下さい。正規表現では、このような位置を表す表現は、「位置指定子」や「アンカー」などと呼ばれます。

正規表現のメタ文字の一覧はこちらの記事に詳しくまとめました。

行頭の1文だけをマッチさせる

「/^わたしは.*。/」の正規表現を使って、下記について考えてみます。

「わたしはあまり海外に行ったことがないです。今度はフランスに旅行してみたいです。」

上記の全文(わたしは・・・旅行してみたいです。)をマッチします。でも、もし「わたしは、・・・行ったことがないです。」という短い方のマッチングを得たい時、「最短一致」を探す必要があります。

正規表現は、通常は「最長一致(Greedy matching)」として、マッチする最も長い文字列をマッチングします。逆に「最短一致(Non-greedy matching)」を探すには、量指定子「*」に「?」を組み合わせます。

// 行頭のマッチする正規表現
/^わたしは.*?。/

最長・最短一致に関しては、こちらの記事もぜひご覧ください

行末を表す正規表現

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

「$」を使った正規表現の例

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

// 行末にマッチする正規表現
/.*今度はフランスに旅行してみたいです。$/

うまくいきました。ただ、さきほどの例と同様、2つの文章を含む、すべての文字列をマッチしてしまいます。

「わたしはあまり海外に行ったことがないです。今度はフランスに旅行してみたいです。」

行末の一文だけをマッチさせる

たとえば、すべての文字列でなく「・・・・に旅行してみたいです。」という後半の一文だけをマッチするように書き換えます。

これでどうでしょうか?

/.*?に旅行してみたいです。$/

これはうまく行きませんでした。正規表現は左側から処理して行きますので、戻り方向(左方向)への最短を吟味しませんので、先に「.*?」が最初の文章全体をマッチしてしまいます。このようなケースには工夫が必要です。

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

/[^。]*に旅行してみたいです。$/

うまくいきました。

下記の記事で、正規表現の「否定」表現についてまとめています。

【補足】位置指定子(アンカー)について

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

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

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

これらを初めて知った方は「なんなくこんな方法があるんだなあ」というくらいに覚えておくと良いと思います。きっと近い将来、役に立つでしょう。

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

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

少しトリッキーですね。「一文」を「『。』の直後から、次の『。』まで」という前提にして、フランスを含む一文をマッチします。行頭なのか行末なのかはわからないので、「^」、「$」は利用できません。

/[^。]*(?=フランス)[^。]*。/

さきほども紹介しましたが、こちらの記事の後半で「否定先読み」をフィーチャしています。

 

閉じる