Faisons le point sur les groupes de capture, les groupes nommés et les assertions lookaround.
Les parenthèses (...) créent un groupe de capture. On peut en extraire séparément la portion correspondante, ou la réutiliser dans une expression de remplacement avec $1·$2. Si l'on veut créer un groupe sans le capturer, on utilise un groupe non capturant avec (?:...).
(?<name>...) est un groupe de capture nommé. On y accède par son nom plutôt que par un numéro, ce qui améliore la lisibilité à mesure que le motif s'allonge. Dans un remplacement, on le référence par $<name>.
L'anticipation (?=...) fait correspondre une position suivie d'un motif donné, et (?!...) une position qui ne l'est pas, sans consommer cette partie. La rétrospection (?<=...) et (?<!...) examinent de la même façon ce qui précède.
Le point essentiel des assertions lookaround est qu'il s'agit de "conditions qui ne consomment rien". Elles sont puissantes lorsqu'on superpose plusieurs conditions, comme pour vérifier un mot de passe fort, ou lorsqu'on veut ne remplacer que dans un certain contexte.