正規表現:文字列の末尾「$(ドル)」

最終更新:2019-03-29 by Joe

正規表現の基本的なメタ文字、「$(ドル)」の意味と使い方について

「文末」を意味する正規表現「$(ドル)」

正規表現における「$(ドル)」は「文末」や「行の末尾」を意味します。このような位置を限定するメタ文字はアンカー(位置指定子)と呼ばれますが、よく似た働きを持つアンカーに「^(ハット、キャレット)」があります。

「$(ドル)」が示す「文末」の定義とは?

「文」の定義について

「文末」を見つけるには、まず「文」の定義をクリアにしておく必要があります:

  1. 改行するまでを一行とし、これを文とする
  2. ファイル内にある文字列を(改行記号も含めて)1つの文とする。

「改行」もバイト単位で見てしまえば、ただの1文字にすぎません。この場合、ファイル内のテキストが1文のようにも見えます。

シングルラインとマルチライン

初期状態において、上記の、1と2のどちらの振る舞いとなるかは、正規表現エンジンの仕様次第です。例えば、PHPの正規表現エンジンであるPCREにおいては、「^」「$」は「テキスト全体の最初と最後」と定義されています。

このように、改行を含んで全文のテキストを1文とみなす処理を「シングルラインモード」と言い、これに対して、改行で区切って1文とみなす処理を「マルチラインモード」と言います。

シングルライン・マルチラインどちらで実行するかは、通常、修飾子を使って指定できます。特に PCRE においては、m でマルチラインを指定できます。

以下、PHP.net:パターン修飾子 より抜粋です。

m (PCRE_MULTILINE)

デフォルトで、PCRE は、検索対象文字列を(実際には複数行からなる 場合でも)単一の行からなるとして処理します。 「行頭」メタ文字 (^) は、対象文字列の最初にしかマッチしません。 一方、「行末」メタ文字 ($) は、文字列の最後、または (D 修飾子が設定されていない場合) 最後にある改行記号の前のみにしかマッチしません。 この動作は Perl と同じです。 この修飾子を設定すると、「行頭」および「行末」メタ文字は 対象文字列において、文字列の最初と最後に加えて、 各改行の直前と直後にそれぞれマッチします。 この動作は、Perl の /m 修飾子と同じです。 対象文字列の中に “\n” 文字がない場合や、 またはパターンに ^ または $ がない場合は、 この修飾子を設定しても意味はありません。

「$(ドル)」を使った正規表現

「$(ドル)」を正規表現の使った例です。

// 「カルビ」で終わる文字列
特上カルビ$
やっぱり、塩だれカルビ$

「$(ドル)」 の参考情報

正規表現の基本と、メタ文字の一覧をこちらにまとめています。