17 mai 2013

[Howto] A quoi servent les expressions régulières ?

Je ne vais pas faire un cours sur le fonctionnement des expressions régulières (RegEx ou RegExp), mais plutôt vous vanter ce que l'on peut faire avec.

J'ai recensé plusieurs usages que je peux en faire, mais il y en a plein d'autres.

On peut résumer la fonction d'une RegEx en deux choses :
- Vérifier si une chaîne correspond à un motif (pattern).
- Vérifier si une chaîne correspond à un motif, et si oui extraire une partie de cette chaîne.

Rappelons que les RegEx sont implémentées nativement dans beaucoup de langages, comme C#, PHP, JavaScript et même PowerShell avec -match (et d'autres) et y sont facile à utiliser. Néanmoins l'usage intensif de RegEx peut pénaliser les performances de votre application !

1) Rechercher dans un fichier texte avec Notepad+
Par exemple vous rechercher des adresses IPv4 dans un fichier.
Motif de la RegEx: [0-2]?[0-9]?[0-9]\.[0-2]?[0-9]?[0-9]\.[0-2]?[0-9]?[0-9]\.[0-2]?[0-9]?[0-9]
Avec ceci, vous trouverez toute de suite toutes les adresses IPv4 dans du texte. Notez cependant qu'il existe des expressions régulières plus ou moins précises pour faire la même chose. Celle présenter ici est assez simple, par exemple elle considérera 299.299.299.299 comme une adresse IP !

2) Vérifier si un champ est bien saisi dans votre formulair
Par exemple vérifier si le champ e-mail est bien une adresse e-mail, avec jQuery par exemple.
Motif de la RegEx: [-a-zA-Z0-9.]+@[-a-zA-Z0-9.]+\.[a-zA-Z]{2,5}
Encore une fois, ce motif peut être amélioré, ce n'est pas le but ici. Avec cette vérification à la validation du formulaire, vous vous assurez de la bonne saisie de l'adresse e-mail !

3) Manipuler un fichier texte avec Notepad++
Par exemple nous avons un fichier avec un séparateur ; et nous souhaitons supprimer la première colonne.
Motif de la RegEx: ^[^;]+(.+)$
Motif du remplacement : \1
Ceci vous permettra de récupérer, pour chaque ligne, le contenu de la ligne après le premier ;.
On aurait pu également le faire avec Excel en renommant notre fichier en CSV. Mais nous aurions pu vouloir faire quelque chose qu'Excel ne sait pas faire.

4) Extraire une chaîne dans un fichier HTML
Vous pouvez toujours passer par une librairie qui parsera le fichier dans un XMLDocument, et ensuite un peu de XPath pour rechercher le bon Node. C'est d'ailleurs la méthode la plus fiable, mais un peu lourde pour un usage occasionnel.
Par exemple nous voulons récupérer la valeur à l'intérieur d'une balise HTML.
Motif de la RegEx: <div>([^<]+)</div>
Nous pouvons ensuite récupérer facilement ce qui a été capturé par les parenthèses.

5) Dans une requête SQL
Par exemple, MySQL implémente la fonction REGEX qui permet de vérifier si une colonne de notre table correspond à un motif.
Par exemple nous une table commentaire et nous voulons récupérer tous les commentaires qui contiennent des balises HTML.
Motif de la RegEx: <[a-zA-Z]+( .*)?\/?>(.*<\/[a-zA-Z]+>)?
Ce motif permet de rechercher la présence d'une balise HTML. Nous pouvons l'utiliser de cette manière : SELECT * FROM commentaire WHERE body REGEXP '<[a-zA-Z]+( .*)?\/?>(.*<\/[a-zA-Z]+>)?';

6) Parser du langage de script
Les parseurs (et autres compilateurs) ne sont pas fabriqués avec des expressions régulières mais avec des lexèmes de grammaire de bas niveau et des automates, typiquement en Lex/Yacc ou équivalents.
Mais on peut, à haut niveau, utiliser des RegEx qui feront un travail tout aussi remarquable et plus facile d'accès aux néophytes.
Par exemple pour du BBCode sur les forums PHP, la balise [IMG].
Motif de la RegEx: \[IMG\]((https?://)?[-a-zA-Z0-9.]+\.[a-zA-Z]{2,5}(\/.*)?)\[\/IMG\]
Ce motif, améliorable, permettra de capturer l'URL de l'image et donc ensuite de générer la balise HTML <img>. Il faut cependant appliquer un attribut de répétitivité pour que la balise soit recherchée à l'infinie, car l'utilisateur sera susceptible de mettre plusieurs [IMG] dans la même ligne.

7) Rechercher des mots même mal orthographiés
Plutôt que de générer un dictionnaire de toutes les possibilités d'écrire un mot sous toutes ses formes phonétiques, on peut utiliser des motifs spécialement conçus pour rechercher ces mots.
Par exemple, pour la recherche d'insulte sur un forum ou dans un chat.
Motif de la RegEx: con+( |ar|as|ace)
Ce motif permet de remplacer un dictionnaire qui contiendrait 4 insultes, même si l'utilisateur essaie de mal orthographier le mot pour passer outre les filtres de détection, en rajoutant ou ne mettant qu'un seul n par exemple.
On peut ensuite améliorer le même motif comme ceci : c+o+n+( |a+r|a+s|a+c+e)
Ceci permettra de détecter les écritures à rallonges comme cccccooooooonnnnnnnnnaaaaarrrdddd.

8) Modifier en masse les Tag IDv3 de nos MP3
Par exemple avec le logiciel gratuit MP3Tag, on peut créer un Action rapide qui remplace le nom d'un fichier MP3 en utilisant une expression régulière.
Le principe identique existe pour le logiciel Advenced Renamer.