開発ブログ

WWWクリエイターズが送る、Git、CSS、HTML、コマンドライン、Macの便利機能など、開発に関する役立ち情報発信します。気まぐれに更新。

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

最終更新:2017-09-28 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 を使った正規表現がデフォルトですが、すこし違う記法が必要になりますので知っておく必要があります。

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

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

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

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

 

閉じる