Regular Expressions
原子グループ
サーチ…
前書き
通常の非捕捉グループは、エンジンがグループを再入力して、異なるもの(例えば、別の交互のもの、または量指定子が使用されるときにはより少ない文字と一致するもの)を照合しようとします。
アトミックグループは、バックトラックが禁止されている点で、通常の非キャプチャグループとは異なります。グループが終了すると、すべてのバックトラッキング情報は破棄されるため、代替一致は試みられません。
備考
所有量限定子は、エンジンがトークンまたはグループをバックトラックできないという点で原子グループのように動作します。
以下は機能面で同等ですが、一部の機能は他の機能より高速です。
a*+abc
(?>a*)abc
(?:a+)*+abc
(?:a)*+abc
(?:a*)*+abc
(?:a*)++abc
グループ化(?>)
原子グループの使用
アトミックグループの形式は(?>...)
であり、空白の後に?>
を付けます。
次のサンプルテキストを検討してください。
ABC
正規表現は、 ABC
のA
より前のテキストの位置0から始まる一致を試みます。
大文字と小文字を区別しない表現した場合(?>a*)abc
を使用した、 (?>a*)
1に一致したまま、文字をA
BC
一致する残りのテキストとして(?>a*)
グループが終了し、残りのテキストに対してabc
が試行されます。これは一致しません。
エンジンがアトミックグループにバックトラックできないため、現在のパスは失敗します。エンジンは、後の位置1、であろうテキストの次の位置に移動A
および前B
のABC
。
正規表現(?>a*)abc
が再び試みられ、 (?>a*)
A
0回マッチA
。
BC
一致する残りのテキストとして(?>a*)
グループが終了し、 abc
が試行されますが失敗します。
ここでも、エンジンは原子グループにバックトラックすることができないため、現在のパスは失敗します。テキストのすべての位置が使い果たされるまで、正規表現は失敗し続けます。
非原子群の使用
通常のキャプチャしていないグループは、開いた括弧の後に?:
付けた形式(?:...)
を持ち?:
。
同じサンプルテキストが与えられているが、代わりに大文字小文字を区別しない式(?:a*)abc
を指定すると、バックトラックが発生する可能性があるため、一致します。
まず、 (?:a*)
はテキスト中の文字A
を消費します
ABC
去る
BC
一致する残りのテキストとして(?:a*)
グループが終了し、残りのテキストに対してabc
が試行され、一致しません。
エンジンにバックトラック(?:a*)
基と1より少ない文字の照合を試み:1ではなくマッチングの文字を、それが0一致させようとA
A
文字を、そして(?:a*)
グループが終了します。この葉
ABC
一致する残りのテキストとして正規表現のabc
は、残りのテキストとのマッチングを正常にabc
ようになりました。
その他のテキスト例
アトミック・グループと非アトミック・グループの両方で(この場合も大文字と小文字を区別しない)このサンプル・テキストを考えてみましょう。
AAAABC
正規表現は、 AAAABC
最初のA
より前のテキストの位置0から始まる一致を試みます。
原子群を用いたパターンは(?>a*)abc
ほぼ同じ原子に動作し、一致することができません ABC
すべての4:上記の実施例A
最初と一致している文字(?>a*)
離脱BC
よう残りのテキストは一致する)、 abc
はそのテキストに一致することができません。グループを再入力することができないため、一致が失敗します。
非原子群を用いたパターン(?:a*)abc
非原子と同様に動作し、一致することができるであろうABC
上記の例:すべての4 A
文字が最初に一致している(?:a*)
(去ります一致する残りのテキストとしてBC
)、 abc
はそのテキストに一致することができません。グループを再入力することができるので、 A
が1つ少なくなります。3 A
が4の代わりにマッチします(一致する残りのテキストとしてABC
が残っています) abc
はそのテキストを正常にマッチングできます。