サーチ…


前書き

通常の非捕捉グループは、エンジンがグループを再入力して、異なるもの(例えば、別の交互のもの、または量指定子が使用されるときにはより少ない文字と一致するもの)を照合しようとします。

アトミックグループは、バックトラックが禁止されている点で、通常の非キャプチャグループとは異なります。グループが終了すると、すべてのバックトラッキング情報は破棄されるため、代替一致は試みられません。

備考

所有量限定子は、エンジンがトークンまたはグループをバックトラックできないという点で原子グループのように動作します。

以下は機能面で同等ですが、一部の機能は他の機能より高速です。

a*+abc
(?>a*)abc
(?:a+)*+abc
(?:a)*+abc
(?:a*)*+abc
(?:a*)++abc

グループ化(?>)

原子グループの使用

アトミックグループの形式は(?>...)であり、空白の後に?>を付けます。

次のサンプルテキストを検討してください。

ABC

正規表現は、 ABCAより前のテキストの位置0から始まる一致を試みます。

大文字と小文字を区別しない表現した場合(?>a*)abcを使用した、 (?>a*) 1に一致したまま、文字をA

BC

一致する残りのテキストとして(?>a*)グループが終了し、残りのテキストに対してabcが試行されます。これは一致しません。

エンジンがアトミックグループにバックトラックできないため、現在のパスは失敗します。エンジンは、後の位置1、であろうテキストの次の位置に移動Aおよび前BABC

正規表現(?>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はそのテキストを正常にマッチングできます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow