次の方法で共有


正規表現 (C++)

C++ 標準ライブラリでは、複数の正規表現文法がサポートされています。 このトピックでは、正規表現を使用するときに使用できる文法のバリエーションについて説明します。

正規表現の文法

使用する正規表現文法は、 std::regex_constants::syntax_option_type 列挙値のいずれかを使用して指定します。 これらの正規表現文法は、 std::regex_constantsで定義されています。

  • ECMAScript: これは、JavaScript と .NET 言語で使用される文法に最も近い言語です。
  • basic: POSIX basic 正規表現または BRE。
  • extended: POSIX extended 正規表現または ERE。
  • awk: これは extendedですが、印刷されない文字の場合はエスケープが多くなります。
  • grep: これは basicですが、改行 (\n) 文字で代替を分離することもできます。
  • egrep: これは extendedですが、改行文字で代替文字を分離することもできます。

既定では、文法が指定されていない場合、 ECMAScript が想定されます。 指定できる文法は 1 つだけです。

複数のフラグを適用することもできます。

  • icase: 一致する場合は大文字と小文字が区別されません。
  • nosubs: マークされた一致 (つまり、かっこ内の式) を無視します。置換は保存されません。
  • optimize:より大きな建設時間を犠牲にして、より迅速にマッチングを行います。
  • collate: ロケールに依存する照合順序を使用します (たとえば、フォーム [a-z]の範囲)。

0 個以上のフラグを文法と組み合わせて正規表現エンジンの動作を指定できます。 フラグのみを指定した場合、 ECMAScript は文法と見なされます。

要素

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

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

  • 改行を除くターゲット シーケンス内の任意の文字と一致する ワイルドカード文字'.'

  • [expr]形式の角かっこ式。これは、式exprで定義されたセット内の文字または照合順序要素、または式exprで定義されたセット内にないターゲット シーケンス内の文字または照合順序要素と一致するフォーム [^expr]の文字または照合順序要素と一致します。

    expr には、次の任意の組み合わせを含めることができます。

    • 個々の文字。 exprによって定義されたセットに文字を追加します。

    • フォーム ch1-ch2文字範囲exprによって定義されたセットに[ch1, ch2]閉じた範囲内の値で表される文字を追加します。

    • フォーム [:name:]文字クラス。 名前付きクラスの文字を、 exprによって定義されたセットに追加します。

    • フォーム [=elt=]等価クラスexprによって定義されたセットに、eltに相当する照合要素を追加します。

    • フォーム [.elt.]照合記号exprによって定義されたセットにelt照合順序要素を追加します。

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

  • 区切り記号間のパターンで一致するターゲット シーケンス内の文字のシーケンスと一致する、basicおよびgrepの形式 (部分式)、または \(subexpression\) のキャプチャ グループ

  • ターゲット シーケンス内の文字kと一致する、フォーム \kID エスケープ

例 :

  • 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、basic、およびgrepでは、要素をフォーム \ddバックリファレンスにすることもできます。ここで、ddは、ターゲット シーケンス内の文字のシーケンスに一致する 10 進値 N を表します。これは、N 番目のキャプチャ グループで一致する文字のシーケンスと同じです。

たとえば、最初の (および唯一の) キャプチャ グループが最初のシーケンス "a"と一致し、その後、\1が最終的なシーケンス "a"と一致するため、(a)\1はターゲット シーケンス "aa"と一致します。

ECMAScriptでは、要素は次のいずれかになります。

  • 形式 (?: 部分式) の非キャプチャ グループ。 区切り記号間のパターンで一致するターゲット シーケンス内の文字のシーケンスと一致します。

  • フォーム \f\n\r\t、または\vの限られたファイル形式のエスケープ。 これらは、ターゲット シーケンス内のフォーム フィード、改行、復帰、水平タブ、垂直タブにそれぞれ一致します。

  • フォーム (= 部分式) の正のアサート。 区切り記号間のパターンで一致するターゲット シーケンス内の文字シーケンスと一致しますが、ターゲット シーケンス内の一致位置は変更されません。

  • フォームの 負のアサート (! subexpression)。 区切り記号間のパターンと一致せず、ターゲット シーケンス内の一致位置を変更しない、ターゲット シーケンス内の任意の文字シーケンスに一致します。

  • フォーム \xhh16 進エスケープ シーケンスhh 2 桁の 16 進数で表されるターゲット シーケンス内の文字と一致します。

  • フォーム \uhhhhUnicode エスケープ シーケンスhhhh 4 桁の 16 進数で表されるターゲット シーケンス内の文字と一致します。

  • フォーム \ckコントロール エスケープ シーケンス。 文字 kによって名前が付けられたコントロール文字と一致します。

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

  • フォーム \B負のワード境界アサート。 ターゲット シーケンス内の現在の位置が 単語境界の直後にない場合に一致します。

  • フォーム \d\D\s\S\w\Wdsw 文字エスケープ。 文字クラスの短い名前を提供します。

例 :

  • (?:a) はターゲット シーケンス "a"と一致しますが、キャプチャ グループ 1 がないため、 "(?:a)\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ファイル形式のエスケープ。 これらは、ターゲット シーケンスのバックスラッシュ、アラート、バックスペース、フォーム フィード、改行、復帰、水平タブ、垂直タブにそれぞれ一致します。

  • フォーム \ooo8 進数エスケープ シーケンスoooの 1、2、または 3 桁の 8 進数で表される値を表す、ターゲット シーケンス内の文字と一致します。

繰り返し

正のアサートのアサート、またはアンカー以外の要素には、繰り返しカウントを続けることができます。 最も一般的な種類の繰り返し数は、basicとgrepの {min,max}、または \{min,max\} という形式になります。 この形式の繰り返しカウントの後に続く要素は、少なくとも 最小 の連続する出現回数に一致し、要素に一致するシーケンスの 連続する最大 出現回数以下に一致します。

たとえば、 a{2,3} はターゲット シーケンス "aa" とターゲット シーケンスの "aaa"に一致しますが、ターゲット シーケンス "a" やターゲット シーケンス "aaaa"には一致しません。

繰り返し数は、次のいずれかの形式をとることもできます。

  • {min} または \{min} in basic and grep。 {min,min} に相当します。

  • basicおよびgrepの {min,} または \{min,\}。 {min,unbounded} に相当します。

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

例 :

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

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

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

basicとgrepを除くすべての文法で、繰り返し数は次のいずれかの形式になります。

  • ? は {0,1} と等価です。

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

例 :

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

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

ECMAScriptでは、すべての形式の繰り返し数の後に、最長一致でない繰り返しを指定する文字?を指定できます。

連結

正規表現要素は、 繰り返しカウントの有無にかかわらず連結して、より長い正規表現を形成できます。 結果の式は、個々の要素によって一致するシーケンスの連結であるターゲット シーケンスと一致します。

たとえば、 a{2,3}b はターゲット シーケンス "aab" とターゲット シーケンス "aaab"と一致しますが、ターゲット シーケンス "ab" またはターゲット シーケンス "aaaab"と一致しません。

代替

basicおよびgrepを除くすべての正規表現文法では、連結正規表現の後に文字| (パイプ) と別の連結正規表現を続けることができます。 この方法では、任意の数の連結正規表現を組み合わせることができます。 結果の式は、連結された正規表現の 1 つ以上に一致する任意のターゲット シーケンスと一致します。

複数の連結正規表現がターゲット シーケンスと一致する場合、 ECMAScript は、一致するシーケンスと一致する連結された正規表現の 1 つ目を選択します。これは 最初の一致と呼ばれます。 他の正規表現文法では、 最も長い一致を達成するものを選択します。

たとえば、 ab|cd はターゲット シーケンス "ab" とターゲット シーケンス "cd"と一致しますが、ターゲット シーケンス "abd" またはターゲット シーケンス "acd"と一致しません。

grepとegrepでは、改行文字 (\n) を使用して代替を分離できます。

部分

basicとgrepでは、部分式は連結です。 他の正規表現文法では、部分式は代替です。

文法の概要

次の表は、さまざまな正規表現文法で使用できる機能をまとめたものです。

要素 basic extended ECMAScript grep egrep awk
alternation using | + + + +
alternation using \n + +
アンカー + + + + + +
バック リファレンス + + +
ブラケット表現 + + + + + +
を使用してグループをキャプチャする () + + + +
を使用してグループをキャプチャする \(\) + +
制御エスケープ シーケンス +
dsw 文字エスケープ +
ファイル形式エスケープ + +
16 進数のエスケープ シーケンス +
単一文字エスケープ + + + + + +
負のアサート +
負のワード境界アサート +
非キャプチャ グループ +
最長一致以外の繰り返し +
8 進数のエスケープ シーケンス +
通常文字 + + + + + +
positive assert +
を使用した繰り返し {} + + + +
を使用した繰り返し \{\} + +
を使用した繰り返し * + + + + + +
?を使用した繰り返しと+ + + + +
Unicode エスケープ シーケンス +
ワイルドカード文字 + + + + + +
ワード境界アサート +

セマンティックの詳細

Anchor

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

戻るリファレンス

バック参照は円記号で、その後に 10 進値 N が続きます。N 番目の キャプチャ グループの内容と一致します。 N の値は、バック参照の前にあるキャプチャ グループの数を超えてはなりません。 basicとgrepでは、N の値は円記号の後の 10 進数字によって決まります。 ECMAScriptでは、N の値はバックスラッシュの直後にあるすべての 10 進数字によって決定されます。 したがって、 basic および grepでは、正規表現に 9 個を超えるキャプチャ グループがある場合でも、N の値は 9 を超えることはありません。 ECMAScriptでは、N の値は無制限です。

例 :

  • ((a+)(b+))(c+)\3 はターゲット シーケンスの "aabbbcbbb"と一致します。 バック参照 \3 は、3 番目のキャプチャ グループ (つまり、 "(b+)") のテキストと一致します。 ターゲット シーケンスの "aabbbcbb"と一致しません。

  • (a)\2 が無効です。

  • (b(((((((((a))))))))))\10 は、 basic と ECMAScriptで異なる意味を持ちます。 basicでは、バック参照は\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を呼び出すことによって認識されます。 traits.isctype(ch, id)が true を返す場合、文字chはそのようなクラスに属します。 既定の regex_traits テンプレートでは、次の表のクラス名がサポートされています。

Class Name (クラス名) Description
alnum 小文字、大文字、数字
alpha 小文字と大文字
blank スペースまたはタブ
cntrl ファイル形式のエスケープ文字
digit
graph 小文字、大文字、数字、句読点
lower 小文字
print 小文字、大文字、数字、句読点、およびスペース
punct 句読点
space スペース
upper 大文字
xdigit digits、 abcdefABCDEF
d と同じ digit
s と同じ space
w と同じ alnum

文字の範囲

角かっこ式の文字範囲は、角かっこ式で定義されている文字セットに範囲内のすべての文字を追加します。 文字範囲を作成するには、範囲内の最初の文字と最後の文字の間に文字 '-' を配置します。 文字範囲は、最初の文字の数値以上の数値を持ち、最後の文字の数値以下の数値を持つすべての文字をセットに入れます。 追加された文字のこのセットは、プラットフォーム固有の文字表現に依存していることに注意してください。 角かっこ式の先頭または末尾、または文字範囲の最初または最後の文字として文字 '-' が発生した場合は、それ自体を表します。

例 :

  • [0-7] は、{ 01234567 } の文字セットを表します。 ターゲット シーケンス "0""1"などと一致しますが、 "a"には一致しません。

  • ASCII 文字エンコードを使用するシステムでは、 [h-k] は文字 { hijk } のセットを表します。 ターゲット シーケンス "h""i"などと一致しますが、 "\x8A""0"は一致しません。

  • EBCDIC 文字エンコードを使用するシステムでは、 [h-k] は文字セット { hi'\x8A''\x8B''\x8C''\x8D''\x8E''\x8F''\x90'jk } を表します (h0x88 としてエンコードされ、 k0x92としてエンコードされます)。 ターゲット シーケンス "h""i""\x8A"などと一致しますが、 "0"には一致しません。

  • [-0-24] は、{ -0124 } の文字セットを表します。

  • [0-2-] は、{ 012- } の文字セットを表します。

  • ASCII 文字エンコードを使用するシステムでは、 [+--] は文字 { +,- } のセットを表します。

ただし、ロケールに依存する範囲を使用する場合、範囲内の文字はロケールの照合順序規則によって決まります。 範囲の定義の最初の文字の後、および範囲の定義の最後の文字の前に照合される文字は、セット内にあります。 2 つの終了文字もセット内にあります。

要素の照合

照合順序要素は、1 文字として扱われる複数文字シーケンスです。

照合記号

角かっこ式の照合記号は、角かっこ式で定義されている セットに照合要素 を追加します。 照合シンボルを作成するには、 [. を使用し、その後に照合要素を続けて、 .]

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

制御エスケープ シーケンスは、バックスラッシュの後に文字'c'、その後に'z'または'Z'を介して'A''a'のいずれかの文字が続きます。 その文字で名前が付けられた ASCII 制御文字と一致します。 たとえば、 "\ci" はターゲット シーケンスの "\x09"と一致します。これは、Ctrl + I キーの値が 0x09されているためです。

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 文字セット

等価性クラス

角かっこ式の等価クラスは、等値クラス定義内の 照合要素 と等価であるすべての文字と照合要素を、角かっこ式で定義されているセットに追加します。

等価クラスを作成するには、 [= を使用し、その後に照合要素の後に =]を続けて使用します。 内部的には、2 つの照合要素 elt1elt2 は、 traits.transform_primary(elt1.begin(), elt1.end()) == traits.transform_primary(elt2.begin(), elt2.end())場合と同等です。

ファイル形式のエスケープ

ファイル形式のエスケープは、通常の C 言語文字エスケープ シーケンス、 \\\a\b\f\n\r\t\vで構成されます。 これらは、バックスラッシュ、アラート、バックスペース、フォーム フィード、改行、復帰、水平タブ、垂直タブという通常の意味を持ちます。 ECMAScriptでは、\a\bは許可されません。 (\\ は許可されていますが、ファイル形式のエスケープではなく、ID エスケープです)。

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

16 進数のエスケープ シーケンスは、円記号の後に文字 x 続けて 2 桁の 16 進数 (0-9a-fA-F) です。 2 桁の数字で指定された値を持つターゲット シーケンス内の文字と一致します。

たとえば、 "\x41" は、ASCII 文字エンコードを使用する場合に "a" ターゲット シーケンスと一致します。

ID エスケープ

ID エスケープはバックスラッシュの後に 1 文字続きます。 その文字と一致します。 これは、文字に特別な意味がある場合に必要です。 ID エスケープを使用すると、特別な意味が削除されます。 例えば次が挙げられます。

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

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

次の表に示すように、ID エスケープで許可される文字のセットは正規表現の文法によって異なります。

構文 許可される ID エスケープ文字
basic、grep { (){}.[\*^$ }
extended、egrep { (){.[\*^$+?| }
awk、extended plus { "/ }
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 桁、2 桁、または 3 桁の 8 進数 (0 から 7) が続きます。 ターゲット シーケンス内の、それらの数字で指定された値を持つ文字と一致します。 すべての数字が 0されている場合、シーケンスは無効です。

たとえば、 \101 は、ASCII 文字エンコードを使用する場合に "a" ターゲット シーケンスと一致します。

通常の文字

通常の文字は、現在の文法で特別な意味を持たない任意の有効な文字です。

ECMAScriptでは、次の文字は特別な意味を持ちます。

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

basicとgrepでは、次の文字に特別な意味があります。

  • . [ \

また、 basic と grepでは、次の文字は、特定のコンテキストで使用される場合に特別な意味を持ちます。

  • * は、正規表現の最初の文字、正規表現の最初の ^ の後に続く最初の文字、キャプチャ グループの最初の文字、またはキャプチャ グループの最初の ^ に続く最初の文字である場合を除き、すべてのケースで特別な意味を持ちます。

  • ^ は、正規表現の最初の文字である場合に特別な意味を持ちます。

  • $ は、正規表現の最後の文字である場合に特別な意味を持ちます。

extended、egrep、およびawkでは、次の文字に特別な意味があります。

  • . [ \ ( * + ? { |

また、 extended、 egrep、および awkでは、次の文字は、特定のコンテキストで使用される場合に特別な意味を持ちます。

  • ) は、前の文字列と一致する場合に特別な意味を持ちます。 (

  • ^ は、正規表現の最初の文字である場合に特別な意味を持ちます。

  • $ は、正規表現の最後の文字である場合に特別な意味を持ちます。

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

肯定的なアサート

正のアサートはその内容と一致しますが、ターゲット シーケンス内の文字は使用しません。

例 :

  • (=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 桁の数字で指定された値を持つターゲット シーケンス内の文字と一致します。 たとえば、 \u0041 は、ASCII 文字エンコードを使用する場合に "a" ターゲット シーケンスと一致します。

ワイルドカード文字

ワイルドカード文字は、改行以外のターゲット式の任意の文字と一致します。

Word境界

ワード境界は、次の状況で発生します。

  • 現在の文字はターゲット シーケンスの先頭にあり、単語文字の 1 つです A-Za-z0-9_

  • 現在の文字位置はターゲット シーケンスの末尾を超え、ターゲット シーケンスの最後の文字は単語文字の 1 つです。

  • 現在の文字は単語文字の 1 つであり、前の文字は含まれません。

  • 現在の文字は単語文字の 1 つではなく、前の文字は 1 つ前の文字です。

Word の境界アサート

ワード境界アサートは、ターゲット文字列内の現在の位置が ワード境界の直後にある場合に一致します。

照合と検索

正規表現がターゲット シーケンスと一致するには、正規表現全体がターゲット シーケンス全体と一致する必要があります。 たとえば、正規表現 bcd はターゲット シーケンス "bcd" と一致しますが、ターゲット シーケンス "abcd" とターゲット シーケンス "bcde"一致しません。

正規表現検索を成功させるには、ターゲット シーケンス内のどこかに正規表現と一致するサブシーケンスが必要です。 通常、検索では、一致する一番左のサブシーケンスが検索されます。

例 :

  • ターゲット シーケンス内の正規表現 bcd の検索 "bcd" 成功し、シーケンス全体に一致します。 ターゲット シーケンス内の同じ検索 "abcd" も成功し、最後の 3 文字と一致します。 ターゲット シーケンス内の同じ検索 "bcde" も成功し、最初の 3 文字と一致します。

  • ターゲット シーケンス内の正規表現 bcd の検索 "bcdbcd" 成功し、最初の 3 文字に一致します。

ターゲット シーケンス内の特定の場所で一致するサブシーケンスが複数ある場合、一致パターンを選択する方法は 2 つあります。

最初の一致 では、正規表現が一致したときに最初に見つかったサブシーケンスが選択されます。

最長一致 は、その場所で一致するものから最長のサブシーケンスを選択します。 最大長のサブシーケンスが複数ある場合は、最も長い一致が最初に見つかったサブシーケンスを選択します。

たとえば、最初の一致が使用されている場合、ターゲット シーケンス"abcd"の正規表現b|bcの検索は、代替の左側の用語がそのサブシーケンスと一致するため、サブシーケンス "b"と一致します。したがって、最初の一致では、代替の右側の用語は試行されません。 最長一致を使用すると、"bc""b"よりも長いため、同じ検索が"bc"に一致します。

正規表現の末尾に達していない場合でも、一致が失敗せずにターゲット シーケンスの末尾に達した場合、部分一致は成功します。 したがって、部分一致が成功した後、ターゲット シーケンスに文字を追加すると、後で部分一致が失敗する可能性があります。 ただし、部分一致が失敗した後、ターゲット シーケンスに文字を追加しても、後で部分一致が成功することはありません。 たとえば、部分的な一致では、 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++ 標準ライブラリの概要