Limitation de la gourmandise dans les regex en JavaScript

Les expressions régulières sont par défaut gourmandes. Cela signifie qu'elles capturent le maximum de caractères possible. Analysons cela avec un exemple. Supposons que nous ayons la chaîne suivante :

javascriptlet str = 'aeeex zzz x kkk';

Supposons que nous voulions trouver la sous-chaîne 'aeeex' dans cette chaîne en utilisant le modèle suivant : lettre 'a', puis n'importe quel caractère un ou plusieurs fois, puis la lettre 'x'.

javascriptlet res = str.replace(/a.+x/g, '!');

Nous nous attendons à ce que la variable contienne la chaîne '! zzz x kkk'. Cependant, ce n'est pas le cas - la variable contient la chaîne '! kkk'.

La raison est que notre regex cherche tous les caractères de la lettre 'a' à la lettre 'x'. Mais dans notre chaîne, il y a deux lettres 'x' ! À cause de la gourmandise, la regex cherche jusqu'au dernier 'x', capturant ainsi ce à quoi nous ne nous attendions pas.

Bien sûr, souvent, ce comportement est exactement ce dont nous avons besoin. Mais dans ce cas précis, nous aimerions annuler la gourmandise et dire à la regex de chercher jusqu'au premier 'x'.

Pour limiter la gourmandise, il faut mettre un point d'interrogation après l'opérateur de répétition :

javascriptlet res = str.replace(/a.+?x/g, '!');

La gourmandise peut être limitée pour tous les opérateurs de répétition : *, ?, et {} - comme ceci : *?, ?? et {}?.

Задание 1

Soit la chaîne :

javascriptlet str = 'aba accca azzza wwwwa';

Écrivez une regex qui trouvera toutes les chaînes délimitées par la lettre 'a', et remplacera chacune d'elles par '!'. Entre les lettres 'a', il peut y avoir n'importe quel caractère (sauf 'a').