正規表現構文

正規表現は、テキストのマッチングと操作に使用される強力なツールです。通常の文字と特殊文字(「メタ文字」と呼ばれる)で構成され、マッチング対象のテキストパターンを記述するために使用されます。

正規表現は、テキスト内で特定のパターンを検索、置換、抽出、検証することができます。

例:

  • runoo+b、マッチできますサンプル、runooob、runoooooobなど、+記号は、前の文字が少なくとも1回(1回以上)出現しなければならないことを表します。。

  • runoo*b、マッチできますrunob、サンプル、runoooooobなど、*記号は、前の文字が0回でも、1回または複数回でも出現できることを表します(0回、または1回、または複数回)。。

  • colou?rマッチできますcolorまたはcolour,?疑問符は、前の文字が最大で1回しか出現できないことを表します(0回または1回)。。

正規表現の構築方法は数学式の作成方法と同じです。様々なメタ文字と演算子を使って小さな式を組み合わせ、より大きな式を作成できます。正規表現の構成要素は、単一の文字、文字集合、文字範囲、文字間の選択、またはこれらすべての構成要素の任意の組み合わせです。

正規表現はテンプレートとして、ある文字パターンを検索対象の文字列とマッチングさせます。


通常の文字

通常の文字には、メタ文字として明示的に指定されていないすべての印刷可能文字と非印刷文字が含まれます。すべての大文字と小文字、すべての数字、すべての句読点、その他いくつかの記号が含まれます。

文字 説明 例
[ABC]

マッチ[...]にリストされているすべての文字。例:[aeiou]文字列 "google サンプル taobao" の中のすべての e、o、u、a の文字にマッチします。

[^ABC]

を除いてマッチする[...]の中の文字以外のすべての文字。例えば[^aeiou]文字列 "google サンプル taobao" 内の e、o、u、a の文字以外のすべての文字にマッチします。

[A-Z]

[A-Z] は範囲を表し、すべての大文字にマッチします。[a-z] はすべての小文字にマッチします。[0-9] はすべての数字にマッチします。

.

改行文字(\n、\r)以外の任意の1文字にマッチします。[^\n\r] と同等です。

[\s\S]

すべての文字(改行文字を含む)にマッチします。\sすべての空白文字(改行を含む)にマッチし、\Sすべての非空白文字(改行を含まない)にマッチします。両者を組み合わせれば任意の文字にマッチできます。

\w

英字、数字、アンダースコアにマッチします。[A-Za-z0-9_] と同等です。

\d

任意の算用数字(0から9)にマッチします。次と同等です:[0-9]。

テストツール

修飾子:

[0-9]+

マッチテキスト:

123abc456edf789

非印刷文字

非印刷文字も正規表現の構成要素になり得ます。次の表は、非印刷文字を表すエスケープシーケンスを示しています。

文字 説明
\cx x で指定される制御文字にマッチします。例えば、\cM は Control-M または復帰文字にマッチします。x の値は A-Z または a-z のいずれかでなければなりません。そうでない場合、c はリテラルの 'c' 文字として扱われます。
\f フォームフィード(改ページ)文字にマッチします。\x0c および \cL と同等です。
\n 改行文字にマッチします。\x0a および \cJ と同等です。
\r 復帰文字(キャリッジリターン)にマッチします。\x0d および \cM と同等です。
\s スペース、タブ、フォームフィードなどを含む任意の空白文字にマッチします。[ \f\n\r\t\v] と同等です。Unicode 正規表現では全角スペースにもマッチすることに注意してください。
\S 任意の非空白文字にマッチします。[^ \f\n\r\t\v] と同等です。
\t タブ文字にマッチします。\x09 および \cI と同等です。
\v 垂直タブ文字にマッチします。\x0b および \cK と同等です。

特殊文字

いわゆる特殊文字とは、特別な意味を持つ文字のことです。前述のrunoo*bの中の*は「任意の複数の文字」を意味します。文字列内の*記号そのものに対しては、*エスケープを行い、その前にバックスラッシュを付けます。\、つまりruno\*ob文字列にマッチしますruno*ob。

多くのメタ文字は、マッチングしようとする際に特別な扱いが必要です。これらの特殊文字にマッチさせるには、まず文字を「エスケープ」する必要があります。つまり、バックスラッシュ文字\をその前に置きます。次の表は、正規表現における特殊文字を示しています。

特殊文字 説明
$ 入力文字列の末尾位置にマッチします。RegExp オブジェクトの Multiline プロパティが設定されている場合、$ は '\n' または '\r' にもマッチします。$ 文字そのものにマッチさせるには、\$ を使用してください。
( ) 部分式の開始位置と終了位置をマークします。部分式は後で使用するために取得できます。これらの文字にマッチさせるには、\( と \) を使用してください。
* 前の部分式に0回以上マッチします。* 文字そのものにマッチさせるには、\* を使用してください。
+ 前の部分式に1回以上マッチします。+ 文字そのものにマッチさせるには、\+ を使用してください。
. 改行文字 \n 以外の任意の1文字にマッチします。. そのものにマッチさせるには、\. を使用してください。
[ 角括弧式の開始をマークします。[ にマッチさせるには、\[ を使用してください。
? 前の部分式に0回または1回マッチするか、非貪欲な量指定子を示します。? 文字そのものにマッチさせるには、\? を使用してください。
\ 次の文字を特殊文字、リテラル文字、後方参照、または八進エスケープとしてマークします。例えば、'n' は文字 'n' にマッチし、'\n' は改行文字にマッチし、'\\' は "\" にマッチし、'\(' は "(" にマッチします。
^ 入力文字列の先頭位置にマッチします。角括弧式内で使用する場合、角括弧内の文字集合を受け付けない(否定)ことを示します。^ 文字そのものにマッチさせるには、\^ を使用してください。
{ 量指定子式の開始をマークします。{ にマッチさせるには、\{ を使用してください。
| 2つの項目の間の選択肢を示します。| にマッチさせるには、\| を使用してください。

量指定子

量指定子は、正規表現の特定の構成要素がマッチするために何回出現しなければならないかを指定します。全部で*、+、?、{n}、{n,}、{n,m}6種類あります。

文字 説明 例
* 前の部分式に0回以上マッチします。例えば、zo*にマッチできます"z"および"zoo"。*次と同等です:{0,}。 試してみる »
+ 前の部分式に1回以上マッチします。例えば、zo+にマッチできます"zo"および"zoo"、しかしマッチできません"z"。+次と同等です:{1,}。 試してみる »
?

前の部分式に0回または1回マッチします。例えば、do(es)?マッチできます"do"と"does"、しかしマッチできません"dog"。?次と同等です:{0,1}。

試してみる »
{n} n は非負の整数で、ちょうど n 回マッチします。例えば、o{2}マッチできません"Bob"の中の o には、しかしマッチできます"food"の中の2つの o にマッチします。 試してみる »
{n,} n は非負の整数で、少なくとも n 回マッチします。例えば、o{2,}マッチできません"Bob"の中の o には、しかしマッチできます"foooood"の中のすべての o にマッチします。o{1,}次と同等です:o+,o{0,}次と同等です:o*。 試してみる »
{n,m} m と n はともに非負の整数で、n <= m です。最低 n 回、最高 m 回マッチします。例えば、o{1,3}にマッチします"fooooood"の中の最初の3つの o にマッチします。o{0,1}次と同等です:o?。注意:カンマと2つの数値の間にスペースを入れてはいけません。 試してみる »

次の正規表現は正の整数にマッチします。[1-9]最初の数字が0ではないように設定し、[0-9]*任意の複数の数字を表します:

/[1-9][0-9]*/

量指定子は範囲式の後に置かれるため、範囲式全体に適用されます。この例では、0から9までの数字(0と9を含む)だけを指定しています。

ここでは + 量指定子を使用しません。2番目以降の位置に数字が必ずしも必要ではないからです。また ? 文字も使用しません。? を使用すると整数が2桁だけに制限されるからです。

0〜99の2桁の数字にマッチさせたい場合は、次の式を使用して少なくとも1桁、最大2桁を指定できます。

/[0-9]{1,2}/

上記の式には欠点があります。2桁以内の数字のみにマッチし、0や00のような期待に反する値にもマッチします。改良後、1〜99の正の整数にマッチする式は次のとおりです。

/[1-9][0-9]?/

或

/[1-9][0-9]{0,1}/

*と+量指定子はすべて貪欲です。なぜなら、できるだけ多くの文字にマッチしようとするからです。それらの後に?を付けると、非貪欲または最小マッチングを実現できます。

たとえば、HTMLドキュメントを検索して、h1タグ内のコンテンツを探す場合があります。HTMLコードは次のとおりです。

&lt;h1&gt;サンプル-サンプル&lt;/h1&gt;

貪欲:次の式は、開始の小なり記号 (<) から h1 タグを閉じる大なり記号 (>) までのすべてのコンテンツにマッチします。

/&lt;.*&gt;/

非貪欲:開始と終了のh1タグのみにマッチさせたい場合は、次の非貪欲な式は<h1>のみにマッチします。

/&lt;.*?&gt;/

次の正規表現を使用してh1タグにマッチさせることもできます。

/&lt;\w+?&gt;/

*、+ 或 ?量指定子の後に?を置くことで、その式は「貪欲」から「非貪欲」(最小マッチング)に変換されます。


アンカー

アンカーを使用すると、正規表現を行頭または行末に固定でき、単語の境界位置を記述することもできます。

^と$はそれぞれ文字列の始まりと終わりを指します。\b単語の前または後ろの境界を記述します。\B単語境界ではないことを示します。

文字 説明 例
^ 入力文字列の先頭の位置にマッチします。RegExpオブジェクトのMultilineプロパティが設定されている場合、^ は \n または \r の後の位置にもマッチします。 試してみる »
$ 入力文字列の末尾の位置にマッチします。RegExpオブジェクトのMultilineプロパティが設定されている場合、$ は \n または \r の前の位置にもマッチします。 試してみる »
\b 単語境界、つまり単語とスペースの間の位置にマッチします。 試してみる »
\B 単語境界ではない位置にマッチします。つまり、単語の先頭または末尾ではない位置です。 試してみる »

注意:量指定子とアンカーは一緒に使用できません。改行または単語境界の直前または直後には複数の位置を置くことができないため、次のような式は許可されません。^*のような式は許可されません。

行の先頭のテキストにマッチさせるには、正規表現の先頭で^文字を使用します。^この の用法を、角かっこ式内の否定の用法と混同しないように注意してください。

行の末尾のテキストにマッチさせるには、正規表現の末尾で$文字を使用します。

章見出しの検索にアンカーを使用する場合、次の正規表現は、行頭に現れる2つの末尾数字のみを含む章見出しにマッチします。

/^Chapter [1-9][0-9]{0,1}/

本当の章見出しは行頭に現れるだけでなく、その行の唯一のテキストでもあります。次の式は、行頭と行末の両方を限定することで、指定されたマッチが章見出しのみにマッチし、相互参照にはマッチしないようにします。

/^Chapter [1-9][0-9]{0,1}$/

単語境界を使用すると、マッチ範囲を正確に制御できます。次の式は、単語 Chapter の最初の3文字にマッチします。これらの3文字が単語境界の後に現れるためです。

/\bCha/

\bの位置は非常に重要です。文字列の先頭にある場合は単語の先頭でマッチを探し、文字列の末尾にある場合は単語の末尾でマッチを探します。たとえば、次の式は単語 Chapter 内の文字列 ter にマッチします。これは単語境界の前に現れるためです。

/ter\b/

次の式は Chapter 内の文字列 apt にマッチしますが、aptitude 内の文字列 apt にはマッチしません。

/\Bapt/

文字列 apt は単語 Chapter 内では非単語境界に現れますが、単語 aptitude 内では単語境界に現れます。\B非単語境界演算子は単語の先頭または末尾にマッチできないため、次の式は Chapter 内の Cha にはマッチしません。

/\BCha/

選択

丸括弧を使用して()すべての選択肢を囲み、隣接する選択肢の間は|で区切ります。

()はキャプチャグループを示します。()は各グループ内のマッチした値を保存します。複数のマッチ値は数字 n で参照できます(n は数字で、n 番目のキャプチャグループの内容を示します)。

丸括弧を使用すると副作用が生じます。関連するマッチ内容がキャッシュ(キャプチャ)されます。キャプチャが不要な場合は、?:を最初の選択肢の前に置くと、この副作用を排除できます。この場合、括弧はグループ化にのみ使用され、マッチ内容は保存されません。

ここで?:は非キャプチャメタ文字の1つです。他にも2つの非キャプチャメタ文字があります:?=と?!:前者は先読み(lookahead)で、括弧内の正規表現パターンがマッチし始める任意の位置で検索文字列にマッチします。後者は負の先読みで、その正規表現パターンがマッチしない任意の位置で検索文字列にマッチします。

?=、?<=、?!、?<! の使い方の違い

exp1(?=exp2):exp2 の前にある exp1 を検索します(正の先読み)。

(?<=exp2)exp1:exp2 の後ろにある exp1 を検索します(正の後読み)。

exp1(?!exp2):後ろが exp2 ではない exp1 を検索します(負の先読み)。

(?<!exp2)exp1:前が exp2 ではない exp1 を検索します(負の後読み)。

詳細については、以下を参照してください:正規表現の先読みアサーション(lookahead)と後読みアサーション(lookbehind)


後方参照

正規表現パターンまたはその一部の両側に丸括弧を追加すると、関連するマッチが一時バッファに格納されます。キャプチャされた各サブマッチは、正規表現パターン内で左から右に現れる順に格納され、バッファ番号は1から始まり、最大99個のキャプチャされたサブ式を格納できます。各バッファは、\nを使用してアクセスできます。ここで n は特定のバッファを識別する1桁または2桁の10進数です。

非キャプチャメタ文字?:、?= 或 ?!を使用してキャプチャを書き換え、関連するマッチの保存を無視できます。

後方参照の最も単純で最も有用な用途の1つは、テキスト内の同じ隣接する2つの単語を検索することです。次の文を例として挙げます。

Is is the cost of of gasoline going up up?

上記の文には繰り返される単語が複数あります。次の正規表現は単一のサブ式を使用してこれらの繰り返しを特定します。

例

繰り返される単語を検索:

var str = "Is is the cost of of gasoline going up up";
var patt1 = /\b([a-z]+) \1\b/igm;
document.write(str.match(patt1));

試してみる »

キャプチャされた式[a-z]+1つ以上の文字にマッチします。正規表現の2番目の部分\1は、最初のサブマッチ(括弧内でキャプチャされた内容)への後方参照です。つまり、最初の単語と同じ単語が直後に続くことが必要です。

単語境界メタ文字\bは、単語全体のみを検出することを保証します。そうしないと、"is issued" や "this is" のような語句は正しく認識されません。

式の末尾のg(グローバル)フラグは、その式を入力文字列内で見つかるすべてのマッチに適用することを指定します。i(大文字と小文字を無視)フラグは、大文字と小文字を区別しないことを指定します。m(複数行)フラグは、改行文字の両側に潜在的なマッチが現れる可能性があることを指定します。

後方参照は、URIを各コンポーネントに分解することもできます。次のURIをプロトコル(ftp、httpなど)、ドメインアドレス、パスに分解するとします。

https://www.example.com:80/html/html-tutorial.html

次の正規表現はこの機能を提供します。

例

マッチしたすべてのデータを出力:

var str = "https://www.example.com:80/html/html-tutorial.html";
var patt1 = /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/;
arr = str.match(patt1);
for (var i = 0; i < arr.length; i++) {
    document.write(arr[i]);
    document.write("<br>");
}

試してみる »

str.match(patt1)配列を返します。合計5つの要素が含まれます。インデックス0はマッチした文字列全体に対応し、インデックス1〜4は各括弧のキャプチャグループに対応します。

  • 最初の括弧サブ式(\w+):Webアドレスのプロトコル部分をキャプチャします。コロンと2つのスラッシュの前にある任意の単語にマッチします。結果:https
  • 2番目の括弧サブ式([^/:]+):ドメインアドレス部分をキャプチャします。: と / 以外の1文字以上にマッチします。結果:www.example.com
  • 3番目の括弧サブ式(:\d*):ポート番号(ある場合)をキャプチャします。コロンの後の0個以上の数字にマッチします。結果::80
  • 4番目の括弧サブ式([^# ]*):パスとページ情報をキャプチャします。# またはスペースを含まない任意の文字シーケンスにマッチします。結果:/html/html-tutorial.html
その他の拡張