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)io rzucenie palenia . qpasuje q, a grupa przechwytująca upasuje do u . Mecz wewnątrz grupy przechwytujących zostaje podjęty i zostaje utworzona grupa przechwytująca. Więc silnik kontynuuje i. I ibę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)io rzucenie palenia . Ponownie, qdopasowuje q, a grupa bez przechwytywania upasuje do u . Dopasowanie z grupy bez przechwytywania jest brane, ale grupa przechwytująca nie jest tworzona. Więc silnik kontynuuje i. I ibędzie pasować do i . Ta ostatnia próba dopasowania zakończyła się sukcesem. qui jest dopasowane
Złóżmy wniosek q(?=u)io rzucenie palenia . Lookahead jest dodatni i następuje po nim kolejny token. Ponownie qdopasowuje q i udopasowuje u . Ponownie, dopasowanie z lookahead musi zostać odrzucone, więc silnik cofa się z iciągu do u . Lookahead powiodło się, więc silnik działa dalej i. Ale inie można dopasować do ciebie . Więc ta próba dopasowania kończy się niepowodzeniem.
Złóżmy wniosek q(?=u)uo rzucenie palenia . Lookahead jest dodatni i następuje po nim kolejny token. Ponownie qdopasowuje q i udopasowuje u . Dopasowanie z wyprzedzenia musi zostać odrzucone, więc silnik cofa się z uciągu do u . Lookahead powiodło się, więc silnik działa dalej u. I upasuje do ciebie . Więc ta próba dopasowania zakończyła się sukcesem. qu jest dopasowany
Złóżmy wniosek q(?!i)uo rzucenie palenia . Nawet w tym przypadku lookahead jest dodatni (ponieważ inie pasuje) i następuje po nim inny token. Ponownie qpasuje do q, a inie do u . Dopasowanie z wyprzedzenia musi zostać odrzucone, więc silnik cofa się z uciągu do u . Lookahead powiodło się, więc silnik działa dalej u. I upasuje 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.