Lors d’un développement d’un programme informatique, il est parfois nécessaire d’utiliser les expressions rationnelles. On traduit parfois regular expression par expression régulière. L’utilisation d’une expression rationnelle est utile dans le cas où l’on cherche des bouts de chaines de caractères dans du texte. Il est aussi possible de vérifier qu’une chaine de caractères correspond bien à un schéma/motif particulier.
Dans tous les langages modernes (java, ruby, python), les librairies regex sont disponibles en standard. Nous allons voir comment utiliser une fonctionnalité interessante disponible dans la librairie standard de Java.
Use case : tester les URL
Dans notre use case nous voulons vérifier la correspondance d’une chaine de caractères avec une URL. Pour cela nous allons créer une expression rationnel afin de vérifier la bonne correspondance.
(?http|ftp|ssh|amqp|imap|ws)(?s)?://(?[a-zA-Z.-]+)(:(?[0-9]+))?
Avec cette « regex », il est possible de vérifier les chaines suivantes par exemple :
ftp://fileserver.domain:1223
imaps://emailserver.domain:341
Group indexé
Dans la plupart des langages, il est possible de récupérer les différentes parties avec la notion de group indexé. Par exemple, le premier group va correspondre au scheme à savoir http, ftp amqp, etc. ainsi de suite group(1).
Group nommé
Mais dans Java (je n’ai pas vérifié avec les autres langages), il est possible de nommé ces group comme ceci
"(?<scheme>http|ftp|ssh|amqp|imap|ws)(?<secure>s)?://(?<host>[a-zA-Z.-]+)(:(?<port>[0-9]+))?"
Ensuite, il est possible de retrouver la valeur récupérée du group capturé par l’expression rationnelle comme ceci group(“scheme”)
Voici un exemple complet de l’utilisation des group nommés avec Java.
et voici l’output.
scheme : ftp
secure : false
host : fileserver.domain
port : 1223
scheme : amqp
secure : false
host : momserver.domain
port : 999
scheme : imap
secure : true
host : emailserver.domain
port : 341
scheme : ws
secure : true
host : pushserver.domain
port : 433
Conclusion
L’utilisation des regex permet de simplifier certains nombres de problematique de developpement. Malheureusement, elles sont parfois sous-utilisées par les developpeurs car elles sont parfois obscurent. En esperant, que les group nommés puissent les aider plus les utiliser.