Aby lepiej zrozumieć, zastosujmy trzy wyrażenia oraz grupę przechwytywania i przeanalizujmy każde zachowanie.
()
grupa przechwytująca - wyrażenie regularne wewnątrz nawiasów musi być dopasowane, a dopasowanie tworzy grupę przechwytującą
(?:)
grupa nie przechwytująca - wyrażenie regularne wewnątrz nawiasów musi być dopasowane, ale nie tworzy grupy przechwytującej
(?=)
pozytywne spojrzenie w przyszłość - zapewnia, że wyrażenie regularne musi zostać dopasowane
(?!)
negatywne spojrzenie w przyszłość - zapewnia, że dopasowanie wyrażenia regularnego nie jest możliwe
Złóżmy wniosek q(u)i
o rzucenie palenia . q
pasuje q, a grupa przechwytująca u
pasuje do u . Mecz wewnątrz grupy przechwytujących zostaje podjęty i zostaje utworzona grupa przechwytująca. Więc silnik kontynuuje i
. I i
będzie pasować do i . Ta ostatnia próba dopasowania zakończyła się sukcesem. qui zostanie dopasowany i zostanie utworzona grupa przechwytywania z u .
Złóżmy wniosek q(?:u)i
o rzucenie palenia . Ponownie, q
dopasowuje q, a grupa bez przechwytywania u
pasuje do u . Dopasowanie z grupy bez przechwytywania jest brane, ale grupa przechwytująca nie jest tworzona. Więc silnik kontynuuje i
. I i
będzie pasować do i . Ta ostatnia próba dopasowania zakończyła się sukcesem. qui jest dopasowane
Złóżmy wniosek q(?=u)i
o rzucenie palenia . Lookahead jest dodatni i następuje po nim kolejny token. Ponownie q
dopasowuje q i u
dopasowuje u . Ponownie, dopasowanie z lookahead musi zostać odrzucone, więc silnik cofa się z i
ciągu do u . Lookahead powiodło się, więc silnik działa dalej i
. Ale i
nie można dopasować do ciebie . Więc ta próba dopasowania kończy się niepowodzeniem.
Złóżmy wniosek q(?=u)u
o rzucenie palenia . Lookahead jest dodatni i następuje po nim kolejny token. Ponownie q
dopasowuje q i u
dopasowuje u . Dopasowanie z wyprzedzenia musi zostać odrzucone, więc silnik cofa się z u
ciągu do u . Lookahead powiodło się, więc silnik działa dalej u
. I u
pasuje do ciebie . Więc ta próba dopasowania zakończyła się sukcesem. qu jest dopasowany
Złóżmy wniosek q(?!i)u
o rzucenie palenia . Nawet w tym przypadku lookahead jest dodatni (ponieważ i
nie pasuje) i następuje po nim inny token. Ponownie q
pasuje do q, a i
nie do u . Dopasowanie z wyprzedzenia musi zostać odrzucone, więc silnik cofa się z u
ciągu do u . Lookahead powiodło się, więc silnik działa dalej u
. I u
pasuje do ciebie . Więc ta próba dopasowania zakończyła się sukcesem. qu jest dopasowany
Podsumowując, prawdziwa różnica między grupami z wyprzedzeniem i bez przechwytywania polega na tym, czy chcesz po prostu przetestować istnienie lub przetestować i zapisać dopasowanie. Przechwytywanie grupy jest drogie, więc używaj jej rozsądnie.