Petite astuce suite à une discussion twitter avec Guillaume Laforge concernant une fonctionnalité de l'API tierce JRegex : l'incomplete matching.
Le tout à fini dans un billet de son blog anglophone : Incomplete string regex matching, et j'en profite pour faire de même en français !
Mais d'abord qu'est-ce que l'incomplete matching ? Cela permet simplement de valider partiellement une expression régulière.
Quel intérêt ? Cela permet par exemple de vérifier une saisie en cours sans générer d'erreur (par exemple lorsque la saisie n'est pas terminé).
Par exemple si l'on souhaite faire saisir à l'utilisateur une heure au format habituelle HH:MM, on utilise une expression régulière de la forme suivante : \d\d:\d\d (soit deux blocs de deux chiffres séparés par deux-points).
Une fois la saisie terminée, on peut la vérifier très facilement via notre expression régulière et la méthode matches(). Mais cette méthode renverra une valeur négative pour toutes les saisies intermédiaires, puisqu'elles ne respectent pas le pattern.
Ainsi si je veux saisir "18:15", les chaines intermédiaires "", "1", "18", "18:" et "18:1" ne pourront pas être validées par matches() et génèreront des "faux-négatifs", empêchant toute validation à la volée...
C'est là qu'entre en jeu l'incomplete matching de JRegex. Elle propose une méthode matchesPrefix() permettant de vérifier si la chaine correspond entièrement ou partiellement à l'expression régulière, ce qui permet de ne pas générer de faux-négatif pour toutes les chaines intermédiaires, tout en permettant de détecter une saisie incorrecte au plus tôt...
Pourtant, il n'y a pas besoin de passer par une librairie externe pour faire cela, puisque c'est intégré dans l'API standard depuis Java 5.0...
...