Les recherches non-greedy

Parent Previous Next



Les recherches non-greedy



Le mot anglais greedy signifie « gourmand ». En Javascript, les regex sont généralement gourmandes, ce qui veut dire que lorsqu'on utilise un quantificateur comme le +, le maximum de caractères est recherché, alors que ce n'est pas toujours le comportement espéré. Petite mise en lumière : nous allons construire une regex qui va extraire l'adresse Web à partir de cette portion de HTML sous forme de chaîne de caractères :

  var html = '<a href="www.mon-adresse.be">Mon site</a>';


Voici la regex qui peut être construite :

  /<a href="(.+)">/


Et ça marche :

/<a href="(.+)">/.exec(html);

 

alert(RegExp.$1); // www.mon-adresse.be


Maintenant, supposons que la chaîne de caractères ressemble à ceci :

var html = '<a href="www.mon-adresse.be"><strong class="web">Mon site</strong></a>';


Et là, c'est le drame :



La valeur renvoyée n'est pas celle qu'on attendait





En spécifiant .+ comme quantificateur, on demande de rechercher le plus possible de caractères jusqu'à rencontrer les caractères « "> », et c'est ce que le Javascript fait :



Javascript s'arrête à la dernière occurrence souhaitée



Le Javascript va trouver la partie surlignée : il cherche jusqu'à ce qu'il tombe sur la dernière apparition des caractères « "> ». Mais ce n'est pas dramatique, fort heureusement !


Pour pallier ce problème, nous allons écrire le quantificateur directement suivi du point d'interrogation, comme ceci :

var html = '<a href="www.mon-adresse.be"><strong class="web">Mon site</strong></a>';

 

/<a href="(.+?)">/.exec(html);

 

alert(RegExp.$1);


Le point d'interrogation va faire en sorte que la recherche soit moins gourmande et s'arrête une fois que le minimum requis est trouvé, d'où l’appellation non-greedy (« non gourmande »).


Créé avec HelpNDoc Personal Edition: Créer des sites web d'aide facilement

Site à deux balles