正規表現の基本的なメタ文字、「$(ドル)」の意味と使い方について
目次
「文末」を意味する正規表現「$(ドル)」
正規表現における「$(ドル)」は「文末」や「行の末尾」を意味します。このような位置を限定するメタ文字はアンカー(位置指定子)と呼ばれますが、よく似た働きを持つアンカーに「^(ハット、キャレット)」があります。
「$(ドル)」が示す「文末」の定義とは?
「文」の定義について
「文末」を見つけるには、まず「文」の定義をクリアにしておく必要があります:
- 改行するまでを一行とし、これを文とする
- ファイル内にある文字列を(改行記号も含めて)1つの文とする。
「改行」もバイト単位で見てしまえば、ただの1文字にすぎません。この場合、ファイル内のテキストが1文のようにも見えます。
シングルラインとマルチライン
初期状態において、上記の、1と2のどちらの振る舞いとなるかは、正規表現エンジンの仕様次第です。例えば、PHPの正規表現エンジンであるPCREにおいては、「^」「$」は「テキスト全体の最初と最後」と定義されています。
このように、改行を含んで全文のテキストを1文とみなす処理を「シングルラインモード」と言い、これに対して、改行で区切って1文とみなす処理を「マルチラインモード」と言います。
シングルライン・マルチラインどちらで実行するかは、通常、修飾子を使って指定できます。特に PCRE においては、m でマルチラインを指定できます。
以下、PHP.net:パターン修飾子 より抜粋です。
m (PCRE_MULTILINE)
デフォルトで、PCRE は、検索対象文字列を(実際には複数行からなる 場合でも)単一の行からなるとして処理します。 「行頭」メタ文字 (^) は、対象文字列の最初にしかマッチしません。 一方、「行末」メタ文字 ($) は、文字列の最後、または (D 修飾子が設定されていない場合) 最後にある改行記号の前のみにしかマッチしません。 この動作は Perl と同じです。 この修飾子を設定すると、「行頭」および「行末」メタ文字は 対象文字列において、文字列の最初と最後に加えて、 各改行の直前と直後にそれぞれマッチします。 この動作は、Perl の /m 修飾子と同じです。 対象文字列の中に “\n” 文字がない場合や、 またはパターンに ^ または $ がない場合は、 この修飾子を設定しても意味はありません。
「$(ドル)」を使った正規表現
「$(ドル)」を正規表現の使った例です。
// 「カルビ」で終わる文字列
特上カルビ$
やっぱり、塩だれカルビ$
「$(ドル)」 の参考情報
正規表現の基本と、メタ文字の一覧をこちらにまとめています。