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 :

Correction d'un regex complexe


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 4
    Par défaut Correction d'un regex complexe
    Bonjour!

    Je souhaite obtenir un regex un peu particulier.
    Il doit commencer par A ou B ou C, suivi de '(', une suite de chiffre séparé par des virgule et terminée par un ')'.

    Voici le regex auquel je pense:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ^(A|B|C){1} \\( ([0-9]+,?){1,12} \\)$
    Le ^ de début et le $ de fin pour éviter les caractères non désirés.
    Le '(A|B|C){1}' pour qu'il y ait juste une fois A ou B ou C
    Le '([0-9]+,?){1,12}' pour avoir de 1 à 12 fois des chiffres avec ou non virgule.

    Donc je veux que ça accepte par exemple: A(1) ou B(1, 2 , 55,3 )

    Mais pour le moment je n'arrive à faire accepter aucune chaine à mon pattern

    Quelqu'un pourrait m'aider?

  2. #2
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Bonjour,

    En général, pour des listes d'éléments, on utilise plutôt la forme :
    au lieu de
    qui accepte des éléments sans séparateur.

    Sinon, je pencherais pour un problème d'espaces qui ne semblent pas gérés.

    Peux-tu nous mettre un bout de code qui utilise ton expression et qui ne reconnaît pas une chaîne 'valide'?

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 4
    Par défaut
    Le code ressemble a ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Pattern p;
    Matcher m;
     
    p = Pattern.compile("(A|B|C){1} \\( [0-9](, [0-9]){0,11} \\)");
    m = p.matcher("A(1)");
     
     if (!m.matches()){
    ...
    Avec ta modification ça va un peu mieux, ça accepte maintenant:
    'A ( 1 )' ou 'A ( 1, 1 )' (en mettant bien les espaces de partout)

    Reste donc à supprimer le fait que les espaces soient obligatoires.

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par nestra Voir le message
    Le '(A|B|C){1}' pour qu'il y ait juste une fois A ou B ou C
    Ou plus simplement [ABC]

    Citation Envoyé par nestra Voir le message
    Le '([0-9]+,?){1,12}' pour avoir de 1 à 12 fois des chiffres avec ou non virgule.
    Il serait plus propre d'utiliser quelques chose comme cela :
    [0-9]+(,[0-9]+){0,11}
    ou bien
    \\d+(,\\d+){0,11}
    Un premier nombre obligatoire, suivi de 0 à 11 autres nombres précédé par une virgule

    Citation Envoyé par nestra Voir le message
    Mais pour le moment je n'arrive à faire accepter aucune chaine à mon pattern
    Cela vient des espaces. Si tu met un espace dans ton pattern, il devra obligatoirement être présent dans la chaine.

    Pour garder une bonne lisibilité malgré tout, tu peux découper la chaine en sous-chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		String regexp = "^"		// Début de chaine
    			+ "[ABC]"		// A, B ou C
    			+ "\\("			// parenthèse ouvrante
    			+ "\\d+"		// Un nombre
    			+ "(,\\d+){0,11}"	// Une virgule suivi d'un nombre (0 à 11 fois)
    			+ "\\)"			// parenthèse fermante
    			+ "$";			// fin de chaine
    Mais ici les chaines ne doivent contenir aucun espace. Il faut donc rajouter des "\\s*" partout où il peut y avoir un espace


    a++

    [edit] un peu grillé

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 4
    Par défaut
    Merci de votre aide!

    En reprenant ma solution précédente, j'ai autorisé les espaces ou je le voulais avec [ ]* et ça devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "(A|B|C){1}[ ]*\\([ ]*[0-9]([ ]*,[ ]*[0-9]){0,11}[ ]*\\)"
    Avec [ABC], n'accepterai-je pas aussi la chaine 'AB (1)'? ' (ce qui est une erreur)

  6. #6
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Citation Envoyé par nestra Voir le message
    Avec [ABC], n'accepterai-je pas aussi la chaine 'AB (1)'? ' (ce qui est une erreur)
    Non, c'est équivalent (et plus clair à mon avis), ça veut bien dire A ou B ou C (avec des 'ou' exclusifs).

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nestra Voir le message
    Avec [ABC], n'accepterai-je pas aussi la chaine 'AB (1)'? ' (ce qui est une erreur)
    Non : [ABC] signifie A ou B ou C


    a++

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

Discussions similaires

  1. [RegEx] Regex complexe pour supprimer certains liens
    Par rudddy dans le forum Langage
    Réponses: 2
    Dernier message: 30/10/2013, 19h30
  2. [RegEx] Besoin d'aide pour construire une regex complexe
    Par Predax dans le forum Langage
    Réponses: 2
    Dernier message: 06/03/2013, 08h52
  3. [Url Rewriting] Regex complexe
    Par T0xF0x dans le forum Apache
    Réponses: 7
    Dernier message: 27/05/2006, 21h35
  4. [C# 1.1] Comment paramétrer mon regex correctement ?
    Par foolsky dans le forum Windows Mobile
    Réponses: 2
    Dernier message: 04/05/2006, 17h24
  5. [RegEx] Avis aux expérimentés ! REGEX complexes..
    Par Thierry8 dans le forum Langage
    Réponses: 20
    Dernier message: 18/12/2005, 18h54

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