Per capire meglio, applichiamo le tre espressioni più un gruppo di cattura e analizziamo ogni comportamento.
() gruppo di cattura : la regex tra parentesi deve essere abbinata e la corrispondenza crea un gruppo di cattura
(?:) gruppo non di cattura : la regex tra parentesi deve essere abbinata ma non crea il gruppo di cattura
(?=) sguardo positivo al futuro - afferma che la regex deve essere abbinata
(?!) sguardo negativo al futuro - afferma che è impossibile abbinare la regex
Applichiamo q(u)iper smettere . qcorrisponde a q e il gruppo di acquisizione ucorrisponde a u . Viene presa la corrispondenza all'interno del gruppo di acquisizione e viene creato un gruppo di acquisizione. Quindi il motore continua i. E icorrisponderà a i . Quest'ultimo tentativo di incontro ha successo. qui è abbinato e un gruppo di cattura con u viene creato .
Applichiamo q(?:u)iper smettere . Ancora una volta, qcorrisponde a q e il gruppo che non cattura ucorrisponde a u . La corrispondenza dal gruppo non di acquisizione viene presa, ma il gruppo di acquisizione non viene creato. Quindi il motore continua i. E icorrisponderà a i . Quest'ultimo tentativo di incontro ha successo. qui è abbinato
Applichiamo q(?=u)iper smettere . Il lookahead è positivo ed è seguito da un altro token. Di nuovo, qcorrisponde a q e ucorrisponde a u . Anche in questo caso, la corrispondenza del lookahead deve essere scartata, quindi il motore torna indietro dalla istringa a u . Il lookahead ha avuto successo, quindi il motore continua i. Ma inon può corrispondere u . Quindi questo tentativo di incontro fallisce.
Applichiamo q(?=u)uper smettere . Il lookahead è positivo ed è seguito da un altro token. Di nuovo, qcorrisponde a q e ucorrisponde a u . La corrispondenza del lookahead deve essere scartata, quindi il motore torna indietro dalla ustringa a u . Il lookahead ha avuto successo, quindi il motore continua u. E ucorrisponderà u . Quindi questo tentativo di incontro ha successo. qu è abbinato
Applichiamo q(?!i)uper smettere . Anche in questo caso il lookahead è positivo (perché inon corrisponde) ed è seguito da un altro token. Di nuovo, qcorrisponde a q e inon corrisponde a u . La corrispondenza del lookahead deve essere scartata, quindi il motore torna indietro dalla ustringa a u . Il lookahead ha avuto successo, quindi il motore continua u. E ucorrisponderà u . Quindi questo tentativo di incontro ha successo. qu è abbinato
Quindi, in conclusione, la vera differenza tra i gruppi lookahead e non-capturing sta nel fatto che tu voglia solo testare l'esistenza o testare e salvare la corrispondenza. Il gruppo di cattura è costoso, quindi usalo con giudizio.