IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Java et regex


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    NONE
    Inscrit en
    Septembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : NONE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 10
    Par défaut Java et regex
    Bonjour,

    Je débute en java et je souhaite utiliser les expressions régulières, mais si les principes de bases sont assez facile à comprendre le cas que je cherches à résoudre et soit impossible soit je n'ai pas assez de recule pour trouver la solution.

    Mon problème : Je cherche à vérifier si une chaine est conforme pour exécuter ou non son traitement.

    Format possible: [nom_de_la_balise]:label1=valeur1;label2=valeur2.... La partie en italique étant optionnelle.

    L'expression régulière que je cherche a créer doit vérifier les points suivants :

    Que la chaine commence bien par un '[' possède un nom et fini bien par un ']' (ce que je tests avec ^\\[{1}[A-Z]{1}[a-z]*\\]{1}),
    Que le séparateur entre la balise et le premier couple (label, valeur) est bien un ':',
    Que les couples (label,valeur) sont bien séparé par un '='
    Que les couples sont bien séparé entre eux par un ';'. Ce dernier n'existant après le dernier couple.

    Merci de votre aide.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    Bonjour,

    Il manque quelques éléments pour qu'on puisse établir ta regex complètement, mais j'ai effectué quelques hypothèses et ça devrait ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^\\[[A-Z][a-z_]*\\](:([a-z0-9]+=[a-z0-9]+;)*[a-z0-9]+=[a-z0-9]+)*$
    - Correspond à [Nom_de_la_balise]. Tu avais l'air de vouloir que ça commence par une majuscule et que ça comporte des "_", j'ai respect ça, mais si ce n'est pas le cas change cette partie en\\[[a-z]*\\]
    - Correspond au label. Comme tu as appelé ta variable label1, j'ai assumé que le label pouvait contenir des chiffres, si ce n'est pas le cas, transforme ces parties en [a-z]
    - Correspond à la valeur. Idem j'ai assumé que ça pouvait contenir des chiffres.
    - Séparateur de couple
    - Séparateur label/valeur

    Voilà qui devrait t'aider. Voilà de quoi tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
            String regex = "^\\[[A-Z][a-z_]*\\](:([a-z0-9]+=[a-z0-9]+;)*[a-z0-9]+=[a-z0-9]+)*$";
     
            String testOK1 = "[Nom_de_la_balise]:label1=valeur1;label2=valeur2";
            String testOK2 = "[Nom_de_la_balise]:label1=valeur1";
            String testOK3 = "[Nom_de_la_balise]";
            String testKO1 = "[Nom_de_la_balise]:label1=valeur1;label2=valeur2;";
            String testKO2 = "[Nom_de_la_balise]:label1=valeur1;";
            String testKO3 = "[Nom_de_la_balise]:";
            String testKO4 = "[Nom_de_la_balise]:label1=";
            String testKO5 = "[Nom_de_la_balise]:=valeur1";
     
            System.out.println(testOK1.matches(regex)); // affiche true
            System.out.println(testOK2.matches(regex)); // affiche true
            System.out.println(testOK3.matches(regex)); // affiche true
            System.out.println(testKO1.matches(regex)); // affiche false
            System.out.println(testKO2.matches(regex)); // affiche false
            System.out.println(testKO3.matches(regex)); // affiche false
            System.out.println(testKO4.matches(regex)); // affiche false
            System.out.println(testKO5.matches(regex)); // affiche false

  3. #3
    Membre averti
    Homme Profil pro
    NONE
    Inscrit en
    Septembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : NONE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 10
    Par défaut
    En un mot comme en 100 : Whaouuu.

    Je vais décortiquer tout ça pour comprendre ou était mon erreur.

    Une question complémentaire si je peux abuser. J'ai testé ta solution en modifiant volontairement le ';' par ':' entre deux couples. Comment peut on modifier le regex pour qu'il retour faux si le séparateur attendu n'est pas le bon.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    J'ai modifié la regexp pour intégrer ton cas de test (testKO6) que je n'avais pas prévu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
             String regex = "^\\[[A-Z][a-z_]*\\](:(([a-z0-9]+=[a-z0-9]+;)*[a-z0-9]+=[a-z0-9]+)+)?$";
     
            String testOK1 = "[Nom_de_la_balise]:label1=valeur1;label2=valeur2";
            String testOK2 = "[Nom_de_la_balise]:label1=valeur1";
            String testOK3 = "[Nom_de_la_balise]";
            String testKO1 = "[Nom_de_la_balise]:label1=valeur1;label2=valeur2;";
            String testKO2 = "[Nom_de_la_balise]:label1=valeur1;";
            String testKO3 = "[Nom_de_la_balise]:";
            String testKO4 = "[Nom_de_la_balise]:label1=";
            String testKO5 = "[Nom_de_la_balise]:=valeur1";
            String testKO6 = "[Nom_de_la_balise]:label1=valeur1:label2=valeur2";
     
            System.out.println(testOK1.matches(regex)); // affiche true
            System.out.println(testOK2.matches(regex)); // affiche true
            System.out.println(testOK3.matches(regex)); // affiche true
            System.out.println(testKO1.matches(regex)); // affiche false
            System.out.println(testKO2.matches(regex)); // affiche false
            System.out.println(testKO3.matches(regex)); // affiche false
            System.out.println(testKO4.matches(regex)); // affiche false
            System.out.println(testKO5.matches(regex)); // affiche false
            System.out.println(testKO6.matches(regex)); // affiche false
    Romain.

  5. #5
    Membre averti
    Homme Profil pro
    NONE
    Inscrit en
    Septembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : NONE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 10
    Par défaut
    Génial.

    Merci pour le coup de main et la formation...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. java.util.regex.Pattern et ThreadLocal
    Par mickael.camelot dans le forum Langage
    Réponses: 5
    Dernier message: 21/12/2011, 10h28
  2. java.util.regex Class Pattern: expression régulières chiffres romains
    Par bipbipman2003 dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 10/06/2011, 15h24
  3. [java.util.regex.Pattern] Regex : contrôler le nombre d'accolades
    Par jmini dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 01/12/2009, 10h33
  4. ResourceBundle - java.util.regex.pattern
    Par babalastar dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 14/02/2008, 14h43
  5. [Performance] IndexOf() ou java.util.regex ?
    Par scifire dans le forum Langage
    Réponses: 3
    Dernier message: 27/03/2006, 19h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo