正規表現:メタ文字(特殊文字)の一覧

最終更新:2018-03-03 by Joe

正規表現のメタ文字や、制御文字などの特殊な表現の文字一覧を作成しました。

正規表現はたまにしか使わない(たまに使う・・)ので忘れては調べての繰り返しになりがちです。ある程度分類ベースでまとまっていると覚えやすいかもしれません。

という事で、役立ちそうな情報をまとめました。

正規表現の基本的なメタ文字

正規表現における「メタ文字」とは、特殊な意味や機能をもつ文字の事です。下記は最も基本的なメタ文字です。いずれも正規表現パターン記述において、使用頻度の高いものとなるでしょう。

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

繰り返しを表すメタ文字「量指定子」

メタ文字の一種である「量指定子」は、直前のパターンの繰り返し(連続)を表すための表現です。一般的な正規表現の利用においては、かなり利用頻度の高い表現のはずです。

通常、量指定子は「欲張りな(Greedy)」なマッチングを行います。これは「可能な限り最長の一致」を探すという事です。これに対して、各量指定子の後方に「?」を置くことで「控えめな(Non-greedy)」なマッチングを行うことができます。下記にすべて記載します。

量指定子(最長一致)最短一致意味
**?直前のパターンの0回以上連続
++?直前のパターンの1回以上連続
???直前のパターンの0回か1回の出現
{N} - 直前のパターンのN回の連続
{min,}{min,}?直前のパターンのmin回以上の連続
{,max}{,max}?直前のパターンのmax回以下の連続
{min,max}{min,max}?直前のパターンのmin回からmax回の連続

※Vimの場合は、表現が異なるため注意が必要です。この記事の末尾をご覧ください。

位置を言明するメタ文字「位置指定子」

メタ文字には、「文頭」「文末」など、文字自体ではなく、「位置」を表現するものがあります。

特に「$」「^」の表現は、多くの言語でデフォルトである「シングルラインモード」では「行頭」「行末」をマッチします。これが、「マルチラインモード」ですと定義が変わり、文書の先頭、文書の末尾となります。利用している言語によって仕様が変わりますので、言語の仕様をご確認下さい。

表現意味
^行頭の位置(シングルラインモード)
$行末の位置(シングルラインモード)
\b単語境界の位置
\B非単語境界の位置
\A検索対象文字列の開始位置(複数行モードとは無関係)
\Z検索対象文字列の終了位置(複数行モードとは無関係)改行があれば、改行の直前
\z検索対象文字列の終了位置(複数行モードとは無関係)
\Gマッチングの開始位置

エスケープシーケンス

バックスラッシュは通常は、特殊文字をエスケープするために使われますが、それ以外にも「非表示文字(制御コードなど)を表現する」ためや、「包括的な文字型」を文字クラスのように表現したりできます。これらはエスケープシーケンスと呼ばれます。

下記は、基本的なエスケープシーケンスの一例です。

表現制御コードの意味
\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進数を表す数字を表すエスケープシーケンスとなるので注意)

エスケープシーケンスに関しては、こちらの記事もご一読下さい。

先読み・後読みの言明(Assertion)表現のメタ文字

すこし複雑に見える下記の記法は、特定のパターンに対して、その前方・後方で追加的な別のマッチングを吟味します。マッチとして検出するかどうかを決める記法です。カッコ内に記載した追加パターンはテストに使われるだけで消費(Consume)されず、後から参照することができません。

このような検証は、言明(Assertion)と呼ばれます。

表現表現名意味
(?=pattern)肯定先読み前方の文字列がpatternに一致するとき、その位置にマッチ
(?<=pattern)肯定後読み後方の文字列がpatternに一致しないとき、その位置にマッチ
(?!pattern)否定先読み前方の文字列がpatternに一致しないとき、その位置にマッチ
(?<!pattern)否定後読み後方の文字列がpatternに一致するとき、その位置にマッチ

言明の中でも「否定先読み」を利用した否定的な正規表現は非常に便利です。こちらの記事をご一読下さい。

【補足】Vimにおける正規表現

Vim の場合すこし違う記法が必要になりますので知っておく必要があります。

下記はmagicにおける、量指定子の記述方法です。

量指定子(最長一致)最短一致意味
\*\{-}直前のパターンの0回以上連続
\+\{-,}直前のパターンの1回以上連続
\=N/A直前のパターンの0回か1回の出現
\{-N} - 直前のパターンのN回の連続
\{-min,}{-min,}?直前のパターンのmin回以上の連続
{-,max}{-,max}}?直前のパターンのmax回以下の連続
{-min,max}{-min,max}?直前のパターンのmin回からmax回の連続

VImのエスケープが必要なメタ文字の種類も異なり「クセがある」などと揶揄されます。他のよく利用するプログラミング言語での正規表現と違って覚えにくい、というのはその通りですので、記法については、マニュアルを参照するのがよいでしょう。

また、Vimデフォルトでは「magic」ですが、「very magic」を利用すると、やや他の言語での正規表現に近づく事ができます。いずれエスケープ処理の違いありますので、多少の混乱は残る気がします・・。