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

正規表現:ドット「.」の意味と使い方。

最終更新:2017-12-22 by Joe

正規表現において、最も使用頻度の高い特殊文字のひとつ「.(ドット)」について、その定義と使い方を詳しくまとめました。基本中の基本かもしれませんが、おさらいの意味もふくめてご覧ください。

正規表現における「.(ドット)」

正規表現の「.(ドット)」は「任意の文字1文字」という意味です。基本的には、OSのような基盤システムの設定で用いる「ワイルドカード(*)」の用に「あらゆる文字」を表現する目的で使うことが多いです。

このような、何らかの一文字を代替するパターンは、しばしば「量指定子」と呼ばれる「X回以上の繰り返し」を表すための特殊文字と一緒に使われます。例えば下記は、1回以上の繰り返しを表す量指定子「+」を利用した、PHPの例です。ドットが表す「任意の文字」を繰り返し、ピリオド(/)で終了する文をマッチします。

// #はデリミタ。
$ptn = '#I am your .+\.#';

if ( preg_match( $ptn, 'I am your father.') )
 echo '私はあなたの父です。';

if ( preg_match( $ptn, 'I am your mother.' ) )
 echo '私はあなたの母です。';

文末の文字としてドットは、バックスラッシュに寄るエスケープが必要であることに注意して下さい。エスケープしないと「任意の一文字」として扱われてしまいます。

シングル/マルチラインモードにおけるドットの違い

改行コードを越えて(含んで)全文書をひと続きの文字列として扱うモードを「シングルラインモード」と呼びます。Pearlや、PHPのPCRE(pearl互換の正規表現ライブラリ)は、シングルラインモードがデフォルトですので、その時ドット(.)は「(改行コードを含む)あらゆる一文字」を意味します。

これをマルチラインに切り替えるためには、パターン修飾子「m」を利用します。PHP.net:パターン修飾子「m」より引用です。

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

モード変更により、ドットだけでなく行頭、行末を表す「^」「$」の意味も変わり、行に対する扱いが抜本的に変化する事がわかります。

任意の文字を表す特殊文字の例

ドットは任意の一文字を表しますが、エスケープシーケンスを利用した表現に、種々の条件で一文字を表現するエスケープシーケンスがあります。

表現制御コードの意味
\aベル文字
\cXCtrl + X(Xは任意の文字)
\n改行コード(Line Feed)
\r改行コード(Carriage Return)
\f改ページ
\Rすべての改行コード(「\n|\r|\n\r」と同義)
\tタブ
\v垂直タブ
\s空白文字(半角スペース、\t、\n、\r、\f)すべての文字。( |\t|\n|\r|\f)と同義
\S空白文字以外のすべての文字
\d数字。[0-9]と同義
\D数字以外の文字列。[^0-9]と同義
\wすべてのアルファベットとアンダースコアのうち任意の一文字。[a-zA-Z0-9_]と同義
\Wすべてのアルファベットとアンダースコア以外の1文字[^a-zA-Z0-9_]と同義
\lすべての半角英小文字のうち1文字
\Lすべての半角英小文字の以外の文字1文字(英大文字、数字、全角文字など含む)
\uすべての半角英大文字のうち1文字
\Uすべての半角英大文字以外の1文字(英小文字、数字、全角文字など含む)
\0NULL文字(0の後に数字を続けると、8進数を表す数字を表すエスケープシーケンスとなるので注意)

量指定子の種類

文字の繰り返しを表す量指定子も、必要に応じて使い分けることで、目的の表現を達成できます。

表現意味
.改行(\n、\r)を除くすべての文字
^行頭の位置(シングルラインモード:行頭、マルチライン:文章の頭)
$行末の位置
A|B「|」の左右の文字列のいずれか(A, Bのいずれか)
\X直後のメタ文字Xをエスケープする
[X]文字クラス。カッコ内に指定した文字のうち、いずれかの一文字
[X-Y]文字クラス内のハイフンは、文字の文字コード上の範囲を指定できる
[^X]否定の文字クラス。カッコ内で指定した文字以外のいずれかの一文字
(X)サブパターン。カッコ内のパターンにマッチした文字列を後方参照できる。ネスト可能。
{Num}量指定子。直前のパターンが何回連続するかをNumで指定。
※「量指定子」セクションを参照

Vim においては表現が大きく異なりますので注意して下さい。こちらの記事に言及しています。

 

 

 

 

閉じる