よりよく理解するために、3つの式とキャプチャグループを適用して、各動作を分析してみましょう。
()
キャプチャグループ -括弧内の正規表現を一致させる必要があります。一致するとキャプチャグループが作成されます
(?:)
非キャプチャグループ -括弧内の正規表現は一致する必要がありますが、キャプチャグループを作成しません
(?=)
ポジティブな先読み -正規表現が一致しなければならないことを表明します
(?!)
否定的な先読み -正規表現に一致することが不可能であることを主張します
quitに適用q(u)i
しましょう。qに一致し、キャプチャグループはuに一致します。キャプチャグループ内の一致が取得され、キャプチャグループが作成されます。したがって、エンジンは継続します。そして、一致します私を。この最後の試合は成功しました。quiが一致し、uを含むキャプチャグループが作成されます。q
u
i
i
quitに適用q(?:u)i
しましょう。この場合も、qに一致し、非キャプチャグループはuに一致します。非キャプチャグループからの一致が取得されますが、キャプチャグループは作成されません。したがって、エンジンは継続します。そして、一致します私を。この最後の試合は成功しました。quiが一致しましたq
u
i
i
quitに適用q(?=u)i
しましょう。先読みは肯定的で、その後に別のトークンが続きます。ここでも、一致したQと一致uと。この場合も、先読みの一致は破棄する必要があるため、エンジンは文字列からuに戻ります。先読みは成功したため、エンジンはに進みます。しかし、uと一致することはできません。したがって、このマッチの試みは失敗します。q
u
i
i
i
quitに適用q(?=u)u
しましょう。先読みは肯定的で、その後に別のトークンが続きます。ここでも、一致したQと一致uと。先読みの一致は破棄する必要があるため、エンジンは文字列内からuに戻ります。先読みは成功したため、エンジンはに進みます。そしてuと一致します。したがって、このマッチの試みは成功しています。quが一致するq
u
u
u
u
quitに適用q(?!i)u
しましょう。この場合でも、先読みは正であり(一致しないため)、別のトークンが続きます。ここでも、一致したqとし、一致していませんuと。先読みの一致は破棄する必要があるため、エンジンは文字列内からuに戻ります。先読みは成功したため、エンジンはに進みます。そしてuと一致します。したがって、このマッチの試みは成功しています。quが一致するi
q
i
u
u
u
つまり、結論として、先読みグループと非キャプチャグループの実際の違いは、存在をテストするか、一致をテストして保存するかだけです。捕獲グループは高価なので、慎重に使用してください。