Para entender melhor, vamos aplicar as três expressões mais um grupo de captura e analisar cada comportamento.
() grupo de captura - o regex entre parênteses deve ser correspondido e a correspondência criar um grupo de captura
(?:) grupo de não captura - o regex entre parênteses deve ser correspondido, mas não cria o grupo de captura
(?=) perspectiva positiva - afirma que a regex deve ser correspondida
(?!) olhar adiante negativo - afirma que é impossível corresponder ao regex
Vamos pedir q(u)ipara sair . qcorresponde a qe o grupo de captura ucorresponde a u . A correspondência dentro do grupo de captura é realizada e um grupo de captura é criado. Então o motor continua com i. E ivai corresponder a i . Esta última tentativa de correspondência foi bem-sucedida. qui é correspondido e um grupo de captura com u é criado.
Vamos pedir q(?:u)ipara sair . Novamente, qcorresponde a qe o grupo de não captura ucorresponde a u . A correspondência do grupo de não captura é obtida, mas o grupo de captura não é criado. Então o motor continua com i. E ivai corresponder a i . Esta última tentativa de correspondência foi bem-sucedida. qui é compatível
Vamos pedir q(?=u)ipara sair . O lookahead é positivo e é seguido por outro token. Mais uma vez, qcorresponde q e upartidas u . Novamente, a correspondência do lookahead deve ser descartada, de modo que o mecanismo recue ida seqüência para u . A antecipação foi bem-sucedida, então o motor continua com i. Mas inão pode corresponder a você . Portanto, essa tentativa de correspondência falha.
Vamos pedir q(?=u)upara sair . O lookahead é positivo e é seguido por outro token. Mais uma vez, qcorresponde q e upartidas u . A correspondência do lookahead deve ser descartada, de forma que o motor recue uda string para u . A antecipação foi bem-sucedida, então o motor continua com u. E uvai combinar com você . Portanto, esta tentativa de correspondência foi bem-sucedida. qu é compatível
Vamos pedir q(?!i)upara sair . Mesmo nesse caso, a antecipação é positiva (porque inão corresponde) e é seguida por outro token. Mais uma vez, qcorresponde q e inão corresponde u . A correspondência do lookahead deve ser descartada, de forma que o motor recue uda string para u . A antecipação foi bem-sucedida, então o motor continua com u. E uvai combinar com você . Portanto, esta tentativa de correspondência foi bem-sucedida. qu é compatível
Portanto, em conclusão, a diferença real entre grupos de antevisão e de não captura é se você deseja apenas testar a existência ou testar e salvar a correspondência. Capturar grupo é caro, então use-o com cautela.