Les regexp ? explication !

Il y a pas si longtemps que sa (pour pas dire ce week-end ! :) ), j’avais besoin de réaliser une recherche à travers un fichier html mal fichu (de ce côté là google n’ a plus à nous apprendre :) là où on nous rabâche à chaque fois de bien mettre en forme notre code bah là pas de chance… c’est le bordel !!

htmlraw.png

Bah oui ! forcément quand vous devez extraire une liste d’url de ce charabia… Vous êtes bein dedans (avec la faut siouplé). Alors forcément je suis sur ubuntu (définitivement pour l’instant), en creusant à droite à gauche j’entends parler de grep, sed, awk… Pour moi c’est un peu du javanais ! puis je trouve une partie de ma réponse : les RegExp.
Alors pour la petite histoire, les RegExp ou expressions régulières permet de rechercher une chaine de caractères (de tout type) grâce à une syntaxe bien pensée : le motif (non pas celui à fleurs !!) en gros et pour faire simple vous pouvez indiquer à votre logiciel de recherche favori (grep par exemple) de rechercher toutes les chaines de caractères qui commencent par http:// et qui se terminent après un .html ou un / (je simplifie au maximum) entre ces deux limites je veux que des caractères utilisés pour la création d’URL (de A à Z, de 0 à 9, avec un ?, !, $ ,_……….) ça parait un peu barbare, mais… imaginez-vous le principe tout simplement comment rechercher une liste d’URL dans un fichier texte ? en testant chaque lettre : trop long ! dans notre exemple on dit juste de trouver un motif qui commence par http:// et qui se termine par .html ou / c’est tout (en gros) et hop vous avez votre recherche.

Comme ça à brut pour point, ça peut paraitre un peu absurde, imaginez-vous un autre exemple, comment cherchez dans une liste de prénoms, tous les prénoms commençant par la A et se terminant en plus par la lettre D… Ca peut paraitre tordu, mais avec les Regexp.

Donc dans mon cas, voici la requête que j’utilise (fonctionne avec un grep dans un shell) :

(https?|ftp|news|telnet|finger|file)://[-a-zA-Z0-9+&@#/%?=~_|:,.;]*[-a-zA-Z0-9+&@#/%=~_|]

On va décortiquer ce motif :

  • (https?|ftp|news|telnet|finger|file):// : on recherche tous les protocoles à rechercher, le ‘|’ est ici utilisé comme un ‘ou’. De même le fait d’utiliser https? permet de recherche ‘http’ ou ‘https’ (cette requête pourrait ré-écrite de la manière suivante : (http|https|ftp|news|telnet|finger|file)://
  • [-a-zA-Z0-9+&@#/%?=~_|:,.;]*[-a-zA-Z0-9+&@#/%=~_|] : on indique les caractères que l’on souhaite rechercher, l’astérisque ‘*’ indique ici une taille de motif indéfinie ensuite on applique de nouveau des critères de sélections

Par contre, je me pose une question ! pourquoi doit-on indiquer le signe moins devant les caractères à rechercher ? si je les supprime mes recherches sont tronquées… Bizarre, si quelqu’un connait la solution je suis preneur.

Poster une bafouille

Votre bafouille