A()
にはいくつかのプロパティ(、、(?!pattern)
など(?=pattern)
とプレーンを(pattern)
含む)がありますが、それらすべてに共通するプロパティはグループ化です。これにより、任意のパターンが単一のユニットになります(ユニットは私自身の用語です)。これは繰り返しに役立ちます。 。
通常のキャプチャには、キャプチャとグループ(pattern)
化のプロパティがあります。キャプチャとは、テキストが内部のパターンと一致することを意味し、一致または置換で、後方参照で使用できるようにキャプチャされます。非キャプチャグループにはキャプチャプロパティがないため、パターンに一致する文字列の開始インデックスと終了インデックスが内部に格納されないため、スペースが少し節約され、速度が少し向上します。(?:pattern)
(pattern)
アトミックグループ化(?>pattern)
には非キャプチャプロパティもあるため、内部で一致したテキストの位置はキャプチャされません。
アトミックグループ化は、キャプチャまたは非キャプチャグループと比較してアトミックのプロパティを追加します。ここでのアトミックとは、現在の位置で、アトミックグループ内のパターンに一致する最初のシーケンス(最初は、指定されたパターンに従ってエンジンがどのように一致するかによって定義されます)を見つけ、それを保持することを意味します(バックトラックは許可されません)。
アトミック性のないグループはバックトラックを許可します-それでも最初のシーケンスを見つけ、先の一致が失敗した場合、正規表現全体の一致が見つかるか、すべての可能性が尽きるまで、バックトラックして次のシーケンスを見つけます。
例
入力文字列:bbabbbabbbbc
パターン:/(?>.*)c/
による最初の一致.*
はbbabbbabbbbc
、貪欲な数量詞によるもの*
です。それはこの試合を保持し、試合を禁止c
します。マッチャーは文字列の最後の次の位置で再試行し、同じことが起こります。したがって、正規表現に一致するものはまったくありません。
入力文字列:bbabbbabbbbc
パターン:/((?>.*)|b*)[ac]/
、テスト用/(((?>.*))|(b*))[ac]/
この正規表現には、、、、の3つの一致がbba
ありbbba
ますbbbbc
。2番目の正規表現を使用する場合、これは同じですが、デバッグ目的でキャプチャグループが追加されているため、すべての一致がb*
内部の一致の結果であることがわかります。
ここでバックトラッキングの動作を確認できます。
アトミックグループ化がない/(.*|b*)[ac]/
と、一致する最後のバックトラックにより、文字列は文字列全体である単一の一致になり[ac]
ます。.*
他の可能性があるため、エンジンは1文字ずつバックトラックに戻ることに注意してください。
Pattern: /(.*|b*)[ac]/
bbabbbabbbbc
^ -- Start matching. Look at first item in alternation: .*
bbabbbabbbbc
^ -- First match of .*, due to greedy quantifier
bbabbbabbbbc
X -- [ac] cannot match
-- Backtrack to ()
bbabbbabbbbc
^ -- Continue explore other possibility with .*
-- Step back 1 character
bbabbbabbbbc
^ -- [ac] matches, end of regex, a match is found
アトミックグループ化では、のすべての可能性.*
が遮断され、最初の一致に制限されます。したがって、文字列全体を貪欲に食べて一致しなかった後、エンジンはb*
パターンを選択する必要があり、正規表現との一致が正常に検出されます。
Pattern: /((?>.*)|b*)[ac]/
bbabbbabbbbc
^ -- Start matching. Look at first item in alternation: (?>.*)
bbabbbabbbbc
^ -- First match of .*, due to greedy quantifier
-- The atomic grouping will disallow .* to be backtracked and rematched
bbabbbabbbbc
X -- [ac] cannot match
-- Backtrack to ()
-- (?>.*) is atomic, check the next possibility by alternation: b*
bbabbbabbbbc
^ -- Starting to rematch with b*
bbabbbabbbbc
^ -- First match with b*, due to greedy quantifier
bbabbbabbbbc
^ -- [ac] matches, end of regex, a match is found
その後の試合はここから続きます。