TR1 の正規表現

更新 : 2007 年 11 月

このトピックでは、TR1 がサポートする各種正規表現エンジンの文法について説明します。

このトピックの内容

  • 正規表現の文法

  • 文法の概要

  • セマンティクスの詳細

  • 一致と検索

  • 書式指定フラグ

正規表現の文法

要素

要素には、次のいずれかを指定できます。

  • 通常の文字。ターゲット シーケンス内の同じ文字と一致する通常の文字です。

  • ワイルドカード文字。ピリオド (.) は、ターゲット シーケンス内の、改行を除く任意の文字と一致します。

  • 角かっこ表現。"[expr]" とした場合は、式 expr で定義された集合に含まれている文字または文字範囲 (照合要素) が、ターゲット シーケンスから検索されます。"[^expr]" とした場合は、式 expr で定義された集合に含まれていない文字または文字範囲 (照合要素) が、ターゲット シーケンスから検索されます。

    式 expr には、次の情報を自由に組み合わせて指定できます。

    • 特定の文字。特定の文字が、expr で定義された集合に追加されます。

    • "ch1-ch2" 形式の文字範囲。ch1 ~ ch2 の範囲に含まれる文字 (両端を含む) が、expr で定義された集合に追加されます。

    • "[:name:]" 形式の文字クラス。特定の名前付きクラスに該当する文字が、expr で定義された集合に追加されます。

    • "[=elt=]" 形式の等価クラス。elt と等価な照合要素が、expr で定義された集合に追加されます。

    • "[.elt.]" 形式の照合記号。照合要素 elt が、expr で定義された集合に追加されます。

  • アンカー。アンカー '^' は、ターゲット シーケンスの先頭と一致します。アンカー '$' は、ターゲット シーケンスの末尾と一致します。

"( subexpression )" 形式のキャプチャ グループ。BRE および grep では "\( subexpression \)" のように記述します。ターゲット シーケンスから、区切り記号で囲まれたパターンと一致する文字シーケンスが検索されます。

  • "\k" 形式の単一文字エスケープ。ターゲット シーケンス内の k という文字と一致します。

例:

  • "a" は、ターゲット シーケンス "a" とは一致しますが、"B"、"b"、"c" のいずれのターゲット シーケンスとも一致しません。

  • "." は、"a"、"B"、"b"、および "c" のすべてのターゲット シーケンスと一致します。

  • "[b-z]" は、"b" や "c" のターゲット シーケンスとは一致しますが、"a" や "B" のターゲット シーケンスとは一致しません。

  • "[:lower:]" は、"a"、"b"、"c" などのターゲット シーケンスとは一致しますが、"B" というターゲット シーケンスとは一致しません。

  • "(a)" は、"a" というターゲット シーケンスと一致し、キャプチャ グループ 1 をサブシーケンス "a" に関連付けます。ただし、"B"、"b"、"c" のいずれのターゲット シーケンスとも一致しません。

ECMAScript、BRE、および grep では、要素に "\dd" 形式の後方参照を使用することもできます。ここで、dd は 10 進値の N を表します。N 番目のキャプチャ グループと一致した文字シーケンスがターゲット シーケンスから検索されます。たとえば、"(a)\1"は、"aa" というターゲット シーケンスと一致します。1 つ目のキャプチャ グループは、"aa" の最初のシーケンス "a" と一致し、\1 は "aa" の最後のシーケンス "a" と一致します。

ECMAScript では、要素に次のいずれかの情報を使用することもできます。

  • "(?: subexpression )" 形式の非キャプチャ グループ。区切り記号で囲まれたパターンと一致する文字シーケンスがターゲット シーケンスから検索されます。

  • "\f"、"\n"、"\r"、"\t"、"\v" の各形式の特定のファイル書式エスケープ。それぞれ、ターゲット シーケンス内のフォーム フィード、改行、復帰、水平タブ、および垂直タブと一致します。

  • "(?= subexpression )" 形式の肯定アサート。区切り記号で囲まれたパターンと一致する文字シーケンスがターゲット シーケンスから検索されます。ただし、ターゲット シーケンス内の一致位置は変更されません。

  • "(?! subexpression )" 形式の否定アサート。区切り記号で囲まれたパターンと一致しない文字シーケンスがターゲット シーケンスから検索されます。ターゲット シーケンス内の一致位置は変更されません。

  • "\xhh" 形式の 16 進エスケープ シーケンス。2 桁の 16 進数 hh で表される文字がターゲット シーケンスから検索されます。

  • "\uhhhh" 形式の Unicode エスケープ シーケンス。4 桁の 16 進数 hhhh で表される文字がターゲット シーケンスから検索されます。

  • "\ck" 形式の制御エスケープ シーケンス。文字 k で指定された制御文字と一致します。

  • "\b" 形式の単語境界アサート。ターゲット シーケンス内の現在の位置が、単語の境界の直後である場合に一致します。

  • "\B" 形式の単語境界否定アサート。ターゲット シーケンス内の現在の位置が、単語の境界の直後ではない場合に一致します。

  • "\d"、"\D"、"\s"、"\S"、"\w"、"\W" の各形式の dsw 文字エスケープ。文字クラスを表す短い名前です。

例:

  • "(?:a)" はターゲット シーケンス "a" と一致しますが、"(?:a)\1" はキャプチャ グループ 1 が存在しないため無効です。

  • "(?=a)a" は、ターゲット シーケンス "a" と一致します。肯定アサートの部分は、ターゲット シーケンス内の最初のシーケンス "a" と一致し、正規表現の最後の "a" は、ターゲット シーケンス内の最初のシーケンス "a" と一致します。

  • "(?!a)a" は、ターゲット シーケンス "a" と一致しません。

  • "a\b." は、ターゲット シーケンス "a~" とは一致しますが、"ab" というターゲット シーケンスとは一致しません。

  • "a\B." は、ターゲット シーケンス "ab" とは一致しますが、"a~" というターゲット シーケンスとは一致しません。

awk では、要素に次のいずれかの情報を使用することもできます。

  • "\\"、"\a"、"\b"、"\f"、"\n"、"\r"、"\t"、"\v" の各形式のファイル書式エスケープ。それぞれ、ターゲット シーケンス内の円記号、警告、バックスペース、フォーム フィード、改行、復帰、水平タブ、および垂直タブと一致します。

  • "\ooo" 形式の 8 進エスケープ シーケンス。1 桁、2 桁、または 3 桁の 8 進数 ooo で表される文字がターゲット シーケンスから検索されます。

繰り返し

肯定アサート、否定アサート、アンカーを除くすべての要素の後には、繰り返し数を指定できます。繰り返し数は、"{min,max}" の形式で指定するのが一般的です。BRE および grep では、"\{min,max\}" のように指定します。この形式の繰り返し数が要素の直後に指定されていた場合、直前の要素の min 回以上、max 回以下の繰り返しと一致します。たとえば、"a{2,3}" は、ターゲット シーケンス "aa" や "aaa" とは一致しますが、"a" や "aaaa" などのターゲット シーケンスとは一致しません。

繰り返し数は、次の形式で指定することもできます。

  • "{min}"、または "\{min\}" (BRE および grep の場合)。"{min,min}" に相当します。

  • "{min,}"、または "\{min,\}" (BRE および grep の場合)。"{min,unbounded}" に相当します。

  • "*". "{0,unbounded}" に相当します。

例:

  • "a{2}" は、ターゲット シーケンス "aa" とは一致しますが、"a" や "aaa" というターゲット シーケンスとは一致しません。

  • "a{2,}" は、"aa" や "aaa" などのターゲット シーケンスとは一致しますが、"a" というターゲット シーケンスとは一致しません。

  • "a*" は、""、"a"、"aa" などのターゲット シーケンスと一致します。

BRE と grep を除くすべての文法では、繰り返し数を次の形式で指定することもできます。

  • "?". "{0,1}" に相当します。

  • "+". "{1,unbounded}" に相当します。

例:

  • "a?" は、"" や "a" というターゲット シーケンスとは一致しますが、"aa" というターゲット シーケンスとは一致しません。

  • "a+" は、"a" や "aa" というターゲット シーケンスとは一致しますが、"" というターゲット シーケンスとは一致しません。

ECMAScript では、すべての形式の繰り返し数の指定に続けて、文字 '?' を追加することで、繰り返しの最短一致を指定できます。

連結

繰り返し数の有無に関係なく、正規表現の要素を連結させて、より長い正規表現にすることができます。最終的な式は、個々の要素によって検索されるシーケンスをつなぎ合わせたものと一致します。たとえば、"a{2,3}b" は、ターゲット シーケンス "aab" や "aaab" とは一致しますが、"ab" や "aaaab" などのターゲット シーケンスとは一致しません。

代替

BRE と grep を除く、すべての正規表現の文法では、連結した正規表現の後に、文字 '|' を指定し、別の連結した正規表現を続けることができます。この方法で、連結した正規表現をいくつでも組み合わせることができます。最終的な式は、連結されている少なくとも 1 つの正規表現と一致する、すべてのターゲット シーケンスと一致します。

複数の連結された正規表現がターゲット シーケンスと一致する場合、ECMAScript では、最初に一致した連結された正規表現が選択されます (最初の一致の原則)。それ以外の正規表現の文法では、最長一致の原則に従って選択されます。たとえば、"ab|cd" は、ターゲット シーケンス "ab" や "cd" とは一致しますが、"abd" や "acd" というターゲット シーケンスとは一致しません。

grep および egrep では、改行文字 ('\n') を使って代替式を区切ることができます。

部分式

BRE および grep では、部分式は "連結" を意味します。その他の正規表現の文法では、部分式は "代替" を意味します。

文法の概要

次の表に、TR1 が備えている各種正規表現の文法で利用できる機能をまとめました。

要素

BRE

ERE

ECMA

grep

egrep

awk

'|' を使った代替

+

+

+

+

'\n' を使った代替

+

+

アンカー

+

+

+

+

+

+

後方参照

+

+

+

角かっこ表現

+

+

+

+

+

+

"()" を使ったキャプチャ グループ

+

+

+

+

"\(\)" を使ったキャプチャ グループ

+

+

制御エスケープ シーケンス

+

dsw 文字エスケープ

+

ファイル形式エスケープ

+

+

16 進エスケープ シーケンス

+

単一文字エスケープ

+

+

+

+

+

+

否定アサート

+

単語境界否定アサート

+

非キャプチャ グループ

+

繰り返しの最短一致

+

8 進エスケープ シーケンス

+

通常の文字

+

+

+

+

+

+

肯定アサート

+

"{}" を使った繰り返し

+

+

+

+

"\{\}" を使った繰り返し

+

+

'*' を使った繰り返し

+

+

+

+

+

+

'?' および '+' を使った繰り返し

+

+

+

+

Unicode エスケープ シーケンス

+

ワイルドカード文字

+

+

+

+

+

+

単語境界アサート

+

セマンティクスの詳細

アンカー

アンカーは、特定の文字と一致するのではなく、ターゲット文字列内の位置と一致します。'^' は、ターゲット文字列の先頭と一致します。'$' は、ターゲット文字列の末尾と一致します。

後方参照

後方参照とは、円記号の後に 10 進値 N が指定されたものです。N 番目のキャプチャ グループの内容と一致します。N の値は、後方参照に先行するキャプチャ グループの数と同じか、それ以下にする必要があります。BRE および grep では、円記号に続く 1 桁の 10 進値が N の値と見なされます。ECMAScript では、円記号の直後に出現するすべての 10 進値が N の値と見なされます。したがって、BRE および grep では、正規表現に 9 個を超えるキャプチャ グループが存在していたとしても、N の値を 9 より大きくすることはできません。ECMAScript では、N の値に上限はありません。

例:

  • "((a+)(b+))(c+)\3" は、ターゲット シーケンス "aabbbcbbb" と一致します。後方参照 "\3" は、3 つ目のキャプチャ グループ、つまり、"(b+)" に該当する文字列と一致します。"aabbbcbb" というターゲット シーケンスとは一致しません。

  • "(a)\2" とすることはできません。

  • "(b(((((((((a))))))))))\10" は、BRE と ECMAScript とで意味が異なります。BRE では、後方参照が "\1" と認識されます。この後方参照は、1 つ目のキャプチャ グループ (つまり、後方参照の前にある、"(b" で始まり、最後の ")" で終わる部分) の内容と一致し、最後の '0' は通常の文字 '0' と一致します。ECMAScript では、後方参照が "\10" と認識されます。この場合は、10 番目のキャプチャ グループ、つまり、一番内側のグループと一致します。

角かっこ表現

角かっこ表現は、文字や照合要素の集合を定義するものです。角かっこ表現の先頭に文字 '^' を付けた場合、その集合のいずれの要素も、ターゲット シーケンス内の文字と一致しない場合に検索が成功します。それ以外の場合、集合内のいずれかの要素が、ターゲット シーケンス内の文字と一致した場合に検索が成功します。

文字の集合は、特定の文字、文字範囲、文字クラス、等価クラス、および照合記号を自由に組み合わせて定義できます。

キャプチャ グループ

キャプチャ グループは、特定の内容を、正規表現の文法における 1 つのまとまりとして指定するものです。その内容と一致する文字列には番号が付けられます。それぞれのキャプチャ グループに振られる番号は、そのキャプチャ グループの左かっこに到達するまで、左かっこの数 (調べようとするキャプチャ グループの左かっこを含む) をカウントすることによって決定されます。この実装では、キャプチャ グループの最大数は 31 です。

例:

  • "ab+" は、ターゲット シーケンス "abb" とは一致しますが、"abab" というターゲット シーケンスとは一致しません。

  • "(ab)+" は、ターゲット シーケンス "abb" とは一致しませんが、"abab" というターゲット シーケンスとは一致します。

  • "((a+)(b+))(c+)" は、ターゲット シーケンス "aabbbc" と一致し、キャプチャ グループ 1 はサブシーケンス "aabbb" と、キャプチャ グループ 2 はサブシーケンス "aa" と、キャプチャ グループ 3 は "bbb" と、キャプチャ グループ 4 はサブシーケンス "c" と関連付けられます。

文字クラス

文字クラスを使用すると、角かっこ表現で定義される文字の集合に、名前付きクラスに含まれるすべての文字を追加できます。文字クラスを指定するには、"[:" に続けて文字クラスの名前を入力し、その後に「:]」と入力します。内部的には、id = traits.lookup_classname を呼び出すことによって、文字クラスの名前が認識されます。特定の文字 ch がこのようなクラスに属しているかどうかは、traits.isctype(ch, id) から true が返されるかどうかで判断できます。既定の regex_traits テンプレートには、次の表に示したクラス名がサポートされています。

クラス名

説明

"alnum"

英小文字、英大文字、および数字

"alpha"

英小文字および英大文字

"blank"

空白またはタブ

"cntrl"

ファイル形式エスケープ文字

"digit"

"graph"

英小文字、英大文字、数字、および区切り記号

"lower"

英小文字

"print"

英小文字、英大文字、数字、区切り記号、および空白

"punct"

区切り記号

"space"

空白

"upper

大文字

"xdigit"

数字、'a'、'b'、'c'、'd'、'e'、'f'、'A'、'B'、'C'、'D'、'E'、'F'

"d"

digit と同じ

"s"

space と同じ

"w"

alnum と同じ

文字範囲

文字範囲を使用すると、その範囲に含まれるすべての文字を、角かっこ表現で定義される文字の集合に追加できます。文字範囲は、その最初の文字と最後の文字とをハイフン ('-') でつなぐことによって指定します。文字に割り当てられている数値の大小関係で、最初の文字以上、最後の文字以下となるすべての文字が検索対象となります。検索対象に追加される一連の文字は、プラットフォーム固有の文字表現に依存します。ハイフン ('-') が角かっこ表現の先頭または末尾に出現した場合、つまり、文字範囲の先頭または末尾の文字として使用されていた場合は、ハイフン文字そのものとして認識されます。

例:

  • "[0-7]" は { '0', '1', '2', '3', '4', '5', '6', '7' } という文字の集合を表します。"0" や "1" というターゲット シーケンスとは一致しますが、"a" には一致しません。

  • ASCII 文字エンコーディングを使用したシステムでは、"[h-k]" が { 'h', 'i', 'j', 'k' } という文字の集合を表します。"h" や "i" というターゲット シーケンスとは一致しますが、"\x8A" や "0" には一致しません。

  • EBCDIC 文字エンコーディングを使用したシステムでは、"[h-k]" は、{ 'h', 'i', '\x8A', '\x8B', '\x8C', '\x8D', '\x8E', '\x8F', '\x90', 'j', 'k' } という文字の集合を表します ('h' は 0x88 として、'k' は 0x92 としてエンコードされます)。"h"、"i"、"\x8A" などのターゲット シーケンスとは一致しますが、"0" とは一致しません。

  • "[-0-24]" は { '-', '0', '1', '2', '4' } という文字の集合を表します。

  • "[0-2-]" は { '0', '1', '2', '-' } という文字の集合を表します。

  • ASCII 文字エンコーディングを使用したシステムでは、"[+--]" が { '+', ',', '-' } という文字の集合を表します。

ただし、ロケールに依存する範囲を使用した場合、該当する範囲の文字は、そのロケールの照合順序規則に基づいて決定されます。該当する照合順序において、範囲の最初の文字よりも後、最後の文字よりも前に来る文字が検索対象となります。集合には範囲の両端の 2 つの文字も含まれます。

照合要素

照合要素とは、単一の文字として扱われる複数文字のシーケンスをいいます。

照合記号

照合記号を使用すると、角かっこ表現で定義される集合に特定の照合要素を追加できます。照合記号を指定するには、"[." に続けて照合要素を入力し、その後に「.]」と入力します。

制御エスケープ シーケンス

制御エスケープ シーケンスは、円記号とアルファベットの 'c' に続けて、'a' ~ 'z' または 'A' ~ 'Z' を入力することによって指定します。これは、対応するアルファベットで指定された ASCII の制御文字と一致します。たとえば、<ctrl-i> には 0x09 という値が割り当てられているため、"\ci" はターゲット シーケンス "\x09" と一致します。

DSW 文字エスケープ

次の表に示したように、dsw 文字エスケープは、文字クラスに割り当てられた短い名前です。

エスケープ シーケンス

等価な名前付きクラス

既定の名前付きクラス

"\d"

"[[:d:]]"

"[[:digit:]]"

"\D"

"[^[:d:]]"

"[^[:digit:]]"

"\s"

"[[:s:]]"

"[[:space:]]"

"\S"

"[^[:s:]]"

"[^[:space:]]"

"\w"

"[[:w:]]"

"[a-zA-Z0-9_]"*

"\W"

"[^[:w:]]"

"[^a-zA-Z0-9_]"*

*ASCII 文字セット

等価クラス

等価クラスを使用すると、そこに定義されている照合要素に相当するすべての文字および照合要素を、角かっこ表現で定義される文字の集合に追加できます。等価クラスを指定するには、"[=" に続けて照合要素を入力し、その後に「=]」と入力します。内部的には、traits.transform_primary(elt1.begin(), elt1.end()) == traits.transform_primary(elt2.begin(), elt2.end()) という条件が成立するとき、elt1 と elt2 の 2 つの照合要素が等価と見なされます。

ファイル形式エスケープ

ファイル形式エスケープは、C 言語の通常の文字エスケープ シーケンス ("\\"、"\a"、"\b"、"\f"、"\n"、"\r"、"\t"、"\v") で構成され、一般には、それぞれ、円記号、警告、バックスペース、フォーム フィード、改行、復帰、水平タブ、および垂直タブに相当します。ECMAScript では、"\a" と "\b" は使用できません。"\\" は使用できますが、これは単一文字エスケープであり、ファイル形式エスケープではありません。

16 進エスケープ シーケンス

16 進エスケープ シーケンスは、円記号とアルファベットの 'x' に続く、2 桁の 16 進数 (0-9a-fA-F) で構成されます。この 2 桁の数値で指定された値を持つ文字がターゲット シーケンスから検索されます。たとえば、ASCII 文字エンコーディングが使用されている場合、"\x41" は、ターゲット シーケンス "A" と一致します。

単一文字エスケープ

単一文字エスケープは、円記号とそれに続く単一の文字で構成されます。対応する文字そのものと一致します。文字に特殊な意味がある場合は、単一文字エスケープを使用することによって、その特殊な意味を打ち消すことができます。たとえば、次のような方法があります。

  • "a*" は、ターゲット シーケンス "aaa" とは一致しますが、"a*" というターゲット シーケンスとは一致しません。

  • "a\*" は、ターゲット シーケンス "aaa" とは一致しませんが、"a*" というターゲット シーケンスとは一致します。

次の表に示すように、単一文字エスケープに使用できる文字は、正規表現の文法によって異なります。

文法

使用できる単一文字エスケープ文字

BRE, grep

{ '(', ')', '{', '}', '.', '[', '\', '*', '^', '$' }

ERE, egre

{ '(', ')', '{', '.', '[', '\', '*', '^', '$', '+', '?', '|' }

awk

ERE + { '"', '/' }

ECMAScript

識別子の一部として使用される可能性のある文字を除く、すべての文字。通常、アルファベット、数字、'$'、'_'、および、Unicode エスケープ シーケンスが含まれます。詳細については、ECMAScript 言語仕様を参照してください。

特定の文字

角かっこに特定の文字を指定すると、その文字が、角かっこ表現で定義される文字の集合に追加されます。角かっこ表現の先頭以外では、'^' は、キャレット (^) 文字そのものを表します。

例:

  • "[abc]" は、ターゲット シーケンス "a"、"b"、および "c" とは一致しますが、"d" とは一致しません。

  • "[^abc]" は、ターゲット シーケンス "d" とは一致しますが、"a"、"b"、または "c" とは一致しません。

  • "[a^bc]" は、ターゲット シーケンス "a"、"b"、"c"、および "^" とは一致しますが、"d" とは一致しません。

ECMAScript を除く、すべての正規表現の文法では、開始角かっこ '[' の直後に ']' が指定された場合、または、開始角かっこ '[' の直後に '^' が来て、その後に ']' が指定された場合、この ']' は右角かっこという文字そのものを表します。

例:

  • "[]a" は無効です。角かっこ表現の終わりを示す ']' が存在しません。

  • "[]abc]" は、ターゲット シーケンス "a"、"b"、"c"、および "]" とは一致しますが、"d" とは一致しません。

  • "[^]abc]" は、ターゲット シーケンス "d" とは一致しますが、"a"、"b"、"c"、または "]" とは一致しません。

ECMAScript では、角かっこ表現で ']' を文字として指定するには、'\]' を使用します。

例:

  • "[]a" は、角かっこ表現が空と見なされるため、ターゲット シーケンス "a" と一致します。

  • "[\]abc]" は、ターゲット シーケンス "a"、"b"、"c"、および "]" とは一致しますが、"d" とは一致しません。

否定アサート

否定アサートは、指定されている内容以外のすべてのものと一致します。ターゲット シーケンス内の現在位置には影響しません。たとえば、"(?!aa)(a*)" は、ターゲット シーケンス "a" と一致し、キャプチャ グループ 1 がサブシーケンス "a" と関連付けられます。ターゲット シーケンス "aa" や "aaa" とは一致しません。

単語境界否定アサート

単語境界否定アサートは、対象文字列内の現在の位置が、単語の境界の直後でない場合に一致と見なされます。

非キャプチャ グループ

非キャプチャ グループは、特定の内容を正規表現の文法における 1 つのまとまりとして指定するものです。通常のキャプチャ グループとは異なり、その内容と一致する文字列に番号は付けられません。たとえば、"(a)(?:b)*(c) は、対象の文字列 "abbc" と一致し、キャプチャ グループ 1 はサブシーケンス "a" に、キャプチャ グループ 2 はサブシーケンス "c" に関連付けられます。

繰り返しの最短一致

繰り返しの最短一致では、ターゲット シーケンスのうち、指定のパターンと一致する最短のサブシーケンスが一致として検出されます。繰り返しの最長一致では、最長のサブシーケンスが一致として検出されます。たとえば、"(a+)(a*b)" は、ターゲット シーケンス "aaab" と一致します。最短一致の原則に従った場合、キャプチャ グループ 1 がターゲット シーケンスの先頭のサブシーケンス "a" と関連付けられ、キャプチャ グループ 2 がターゲット シーケンスの最後のサブシーケンス "aab" と関連付けられます。最長一致の原則に従った場合、キャプチャ グループ 1 はサブシーケンス "aaa" に、キャプチャ グループ 2 はサブシーケンス "b" に関連付けられます。

8 進エスケープ シーケンス

8 進エスケープ シーケンスは、円記号に続く、1 ~ 3 桁の 8 進数 (0 ~ 8) で構成されます。この数値で指定された値を持つ文字がターゲット シーケンスから検索されます。すべての桁を '0' にすることはできません。そのようなシーケンスは無効と見なされます。たとえば、ASCII 文字エンコーディングが使用されている場合、"\101" は、ターゲット シーケンス "A" と一致します。

通常の文字

通常の文字とは、現在の文法において特殊な意味を持たない、有効なすべての文字を指します。

ECMAScript では、特殊な意味を持つ文字として、次の文字があります。

  • ^ $ \ . * + ? ( ) [ ] { } |

BRE および grep では、特殊な意味を持つ文字として、次の文字があります。

  • . [ \

さらに、BRE および grep では、特定のコンテキストで使用した場合に特殊な意味を持つ文字があります。次の文字が該当します。

  • アスタリスク (*)。正規表現の先頭文字として使用された場合や、正規表現の先頭の '^' に続く最初の文字として使用された場合、および、キャプチャ グループの先頭文字として使用された場合や、キャプチャ グループの先頭の '^' に続く最初の文字として使用された場合を除き、'*' はすべての場合において特殊な意味を持ちます。

  • キャレット (^)。正規表現の先頭文字としての '^' は特殊な意味を持ちます。

  • ドル記号 ($)。正規表現の末尾文字としての '$' は特殊な意味を持ちます。

ERE、egrep、および awk では、特殊な意味を持つ文字として、次の文字があります。

  • . [ \ ( * + ? { |

さらに、ERE、egrep、および awk では、特定のコンテキストで使用した場合に特殊な意味を持つ文字があります。次の文字が該当します。

  • 閉じかっこ。先行する '(' と対応関係にある ')' は、特殊な意味を持ちます。

  • キャレット (^)。正規表現の先頭文字としての '^' は特殊な意味を持ちます。

  • ドル記号 ($)。正規表現の末尾文字としての '$' は特殊な意味を持ちます。

通常の文字は、ターゲット シーケンス内の同じ文字と一致します。つまり、既定では、2 つの文字が同じ値で表される場合、一致と見なされます。大文字と小文字を区別しない検索では、traits.translate_nocase(ch0) == traits.translate_nocase(ch1) という条件が成立する場合、ch0 と ch1 の 2 つの文字が一致と見なされます。ロケールに依存する検索では、traits.translate(ch0) == traits.translate(ch1) という条件が成立する場合、ch0 と ch1 の 2 つの文字が一致と見なされます。

肯定アサート

肯定アサートは、指定されている内容と一致しますが、ターゲット シーケンス内の現在位置には影響しません。

例:

  • "(?=aa)(a*)" は、ターゲット シーケンス "aaaa" と一致し、キャプチャ グループ 1 がサブシーケンス "aaaa" と関連付けられます。

  • "(aa)(a*)" は、ターゲット シーケンス "aaaa" と一致し、キャプチャ グループ 1 が、ターゲット シーケンスの先頭のサブシーケンス "aa" に、キャプチャ グループ 2 が、ターゲット シーケンスの最後のサブシーケンス "aa" に関連付けられます。

  • "(?=aa)(a)|(a)" は、ターゲット シーケンス "a" と一致し、キャプチャ グループ 1 が空のシーケンスに関連付けられ (肯定アサートに失敗するため)、キャプチャ グループ 2 がサブシーケンス "a" に関連付けられます。また、ターゲット シーケンス "aa" とも一致します。この場合は、キャプチャ グループ 1 がサブシーケンス "aa" に、キャプチャ グループ 2 が空のシーケンスに関連付けられます。

Unicode エスケープ シーケンス

Unicode エスケープ シーケンスは、円記号とアルファベットの 'u' に続く、4 桁の 16 進数 (0-9a-fA-F) で構成されます。この 4 桁の数値で指定された値を持つ文字がターゲット シーケンスから検索されます。たとえば、ASCII 文字エンコーディングが使用されている場合、"\u0041" は、ターゲット シーケンス "A" と一致します。

ワイルドカード文字

ワイルドカード文字は、改行を除く任意の文字と一致します。

単語の境界

単語の境界とは、次の条件を満たすことをいいます。

  • 現在の文字が、ターゲット シーケンスの先頭に存在し、なおかつ、単語に使用されるいずれかの文字 (A-Za-z0-9_.) に該当する。

  • 現在の文字が、ターゲット シーケンスの最後の次の位置に存在し、なおかつ、ターゲット シーケンスの最後の文字が、単語に使用されるいずれかの文字に該当する。

  • 現在の文字は、単語に使用されるいずれかの文字に該当するが、先行する文字は、単語に使用されるいずれの文字にも該当しない。

  • 現在の文字は、単語に使用されるいずれの文字にも該当しないが、先行する文字は単語に使用されるいずれかの文字に該当する。

単語境界アサート

単語境界アサートを表す正規表現は、対象文字列における現在位置が、単語の境界の直後である場合に一致と見なされます。

一致と検索

正規表現とターゲット シーケンスの "一致" とは、正規表現全体がターゲット シーケンス全体と一致することです。たとえば、"bcd" という正規表現は、ターゲット シーケンス "bcd" とは一致しますが、"abcd" や "bcde" と一致しているとは言えません。

正規表現における "検索" の成功とは、ターゲット シーケンス内のどこか一部分 (サブシーケンス) がその正規表現と一致することです。通常は、一致するサブシーケンスが左端から検索されます。

例:

  • ターゲット シーケンス "bcd" に対し、"bcd" という正規表現を使用した場合、検索は成功し、さらに、シーケンス全体が一致と見なされます。ターゲット シーケンス "abcd" に対して同じ検索を実行した場合も、検索は成功し、最後の 3 文字が一致と見なされます。ターゲット シーケンス "bcde" に対して同じ検索を実行した場合も、検索は成功し、最初の 3 文字が一致と見なされます。

  • ターゲット シーケンス "bcdbcd" に対し、"bcd" という正規表現を使用した場合、検索は成功し、最初の 3 文字が一致と見なされます。

ターゲット シーケンスに、正規表現と一致するサブシーケンスが複数存在した場合、一致するパターンの選択には、2 とおりの方法が考えられます。最初の一致の原則では、正規表現と照らし合わせる際、最初に見つかったサブシーケンスが選択されます。最長一致の原則では、その場所から一致する最長のサブシーケンスが選択されます。最長一致の原則でも、最大長のサブシーケンスが複数存在した場合は、最初に見つかったサブシーケンスが選択されます。たとえば、最初の一致の原則を使用した場合、ターゲット シーケンス "abcd" から "b|bc" を検索する正規表現は、サブシーケンス "b" と一致します。代替式の左側の語句が、サブシーケンスと一致するためです。最初の一致の原則では、代替式の右側の語句は試行されません。同じ検索でも、最長一致の原則を使用した場合は "bc" が一致します。"bc" の方が "b" よりも長いためです。

"部分一致" の成功とは、比較が途中で失敗することなく、ターゲット シーケンスの最後に到達することをいいます。必ずしも、正規表現の最後に到達している必要はありません。したがって、部分一致が成功した後、そのターゲット シーケンスに文字を付加した場合、付加した文字によっては部分一致が失敗する可能性もあります。ただし、部分一致が失敗した後、そのターゲット シーケンスにどのような文字を付加しても、その後、部分一致に成功することはありません。たとえば、部分一致では、"ab" はターゲット シーケンス "a" とは一致しますが、"ac" とは一致しません。

書式指定フラグ

ECMAScript 形式の規則

sed 形式の規則

置換テキスト

"$&"

"&"

正規表現全体と一致する文字シーケンス ([match[0].first, match[0].second))

"$$"

"$"

 

"\&"

"&"

"$`" (ドル記号 + アクサングラーブ)

 

正規表現と一致したサブシーケンスに先行する文字シーケンス ([match.prefix().first, match.prefix().second))

"$'" (ドル記号 + 一重引用符)

 

正規表現と一致したサブシーケンスに続く文字シーケンス ([match.suffix().first, match.suffix().second))

"$n"

"\n"

位置 n のキャプチャ グループと一致する文字シーケンス。n は 0 ~ 9 の数 ([match[n].first, match[n].second))

 

"\\n"

"\n"

"$nn"

 

位置 nn のキャプチャ グループと一致する文字シーケンス。nn は 10 ~ 99 の数 ([match[nn].first, match[nn].second))

参照

その他の技術情報

標準 C++ ライブラリ TR1 拡張リファレンス