理解を深めるために、3 つの式とキャプチャ グループを適用して、それぞれの動作を分析してみましょう。
()
キャプチャ グループ- 括弧内の正規表現が一致する必要があり、一致するとキャプチャ グループが作成されます
(?:)
非キャプチャ グループ- 括弧内の正規表現は一致する必要がありますが、キャプチャ グループは作成されません
(?=)
肯定的な先読み- 正規表現が一致する必要があることを表明します
(?!)
否定先読み- 正規表現に一致することが不可能であることを主張します
辞めるq(u)i
申請をしましょう。はqに一致し、キャプチャ グループはuに一致します。キャプチャ グループ内の一致が取得され、キャプチャ グループが作成されます。したがって、エンジンは で続行します。そして、iに一致します。この最後の一致の試みは成功しました。quiが一致し、uを含むキャプチャ グループが作成されます。
q
u
i
i
辞めるq(?:u)i
申請をしましょう。ここでもqに一致し、非キャプチャ グループはuに一致します。非キャプチャ グループからの一致が取得されますが、キャプチャ グループは作成されません。したがって、エンジンは で続行します。そして、iに一致します。この最後の一致の試みは成功しました。quiが一致します。
q
u
i
i
辞めるq(?=u)i
申請をしましょう。先読みは肯定的で、その後に別のトークンが続きます。繰り返しますが、 qとuに一致します。ただし、先読みからの一致は破棄する必要があるため、エンジンは文字列からuに戻ります。先読みが成功したことを考えると、エンジンは を続行します。しかし、uと一致することはできません。したがって、この一致の試みは失敗します。
q
u
i
i
i
辞めるq(?=u)u
申請をしましょう。先読みは肯定的で、その後に別のトークンが続きます。繰り返しますが、 qとuに一致します。ただし、先読みからの一致は破棄する必要があるため、エンジンは文字列からuに戻ります。先読みが成功したことを考えると、エンジンは を続行します。そしてuと一致します。したがって、この一致の試みは成功です。quが一致します。
q
u
u
u
u
辞めるq(?!i)u
申請をしましょう。この場合でも、先読みは肯定的であり (一致しないため)、別のトークンが続きます。繰り返しますが、 qに一致し、 uには一致しません。先読みからの一致は破棄する必要があるため、エンジンは文字列からuに戻ります。先読みが成功したことを考えると、エンジンは を続行します。そしてuと一致します。したがって、この一致の試みは成功です。quが一致します。
i
q
i
u
u
u
したがって、結論として、先読みグループと非キャプチャ グループの本当の違いは、単に存在をテストするか、一致をテストして保存するかだけです。
ただし、キャプチャ グループはコストがかかるため、慎重に使用してください。