-
utiliser un regex?
Bonjour a tous ,
J'aimerai faire une fonction proche d'une requête SQL.
Je voudrai passer en paramètre à cette fonction une chaîne de caractère qui contient des '?' et/ou une '*'.
La fonction me renverrai alors toutes les chaines (stockées dans une liste) vérifiant les conditions.
par exemple ?? me renverrai toutes les chaines de deux lettres.
???a -->les chaines de 4 lettres terminées par a
*-->toutes les chaines
a*-->toutes les chaines commençant par a
...
Est ce que je dois créer cette fonction en comparant caractère par caractère ma chaine en paramètre avec les chaines de ma liste ou est ce que les regex sont adaptés à cette situation ?
-
Comme tu l'as pressenti, l'utilisation de regex semble tout indiqué dans ton cas. D'autant que le code de comparaison sera beaucoup plus générique, et que développer toi-même une fonction ou librairie répondant à tous les cas rique d'être ardu.
Personnellement j'utilise le poteur de Regex Apache (Avalon) pour des raisons de compatibilité avec le JDK 1.3, mais un moteur de regexp est inclus dans la JVM à partir de la 1.4.
Par contre tu n'auras pas le choix de la syntaxe, il te faudra écrire des expressions régulières valide. Mais si les besoins se limites à l'utilisation des wildcards '*' et '?' tu peux très bien autoriser une saisie avec celles-ci et faire un pré-processing de l'expression pour la mettre en conformité avec les regexp.
Jacques Desmazières
-
ok, merci de la réponse,
Cependant, est ce que vous pourriez m'expliquer simplement l'utilisation des regex (déclaration, manipulation des méta caractères) car j'ai bien trouvé le tutoriel d'Hugo ETIEVANT ici même mais j'avoue que je n'ai pas tout à fait compris.
-
Je n'ai jamais utilisé l'API du Jdk 1.4, mais le tutoriel est plutôt bien fait d'après ce que j'en ai vu, mais il est complet donc peut être un peu ardu lors d'une première approche.
Une expression régulière correspond à un "Pattern" appliqué à une chaine de caractère. Une fois ce pattern appliqué à la chaine, on peut alors soit vérifier la concordance, soit faire de l'extraction de sous chaine soit encore faire du remplacement.
Donc dans un premier temps : il faut comprendre les expressions régulières et apprendre comment elles fonctionnent, indépendament de Java. J'ai vu sur le site, si je ne me trompe pas, un lien vers un outil permettant de tester des expressions régulières. Personnellement j'utilise Regexp Coach.
Ensuite il faut implémenter cela en Java. Pour cela il faut procéder en 3 phases (voir page 20 et suivantes du tutoriel):
1 - compiler l'expression régulière pour instancier un Pattern (Pattern.compile)
2 - appliquer le pattern à la chaine de caractères (Pattern.matcher)
3 - dans ton cas, vérifier qu'il y a effectivement un matching (Matcher.matches)
Voilà le tour est joué en 3 lignes de code.
Si tu choisis d'utiliser tes caractères '*' et '?', il te faudra juste les remplacer par leur correspondance en expression régulières ('[.]*' et '.'), en faisant quand même attention aux caractères de contrôle des regexp ( '(', '[', ...)
Bien que je n'aie que survolé la question, j'espère que cela t'aidera
Jacques Desmazières