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

Collection et Stream Java Discussion :

Problème avec les Regexp


Sujet :

Collection et Stream Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 43
    Points : 29
    Points
    29
    Par défaut Problème avec les Regexp
    Bonjour j'ai un petit problème au niveau des expressions régulières. J'essaye de renvoyer une chaine de caractère qui serait de cette forme là : <123456789@monentreprise.fr> pour cela je fais cette méthode :

    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
    22
    23
    24
     
    package toto;
     
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
     
    public class TestRegexp {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
     
    		Pattern pattern;
    		Matcher matcher;
    		String passwdEncrypted;
     
    		pattern = Pattern.compile("^<*>$");
    		matcher = pattern.matcher("+OK bonjour <12356@monentreprise.com>");
    		passwdEncrypted = matcher.group();
    		System.out.println(passwdEncrypted);
    	}
     
    }
    le problème c'est que ça me renvoit la chose suivante :

    Exception in thread "main" java.lang.IllegalStateException: No match found
    at java.util.regex.Matcher.group(Matcher.java:461)
    at java.util.regex.Matcher.group(Matcher.java:421)
    at toto.TestRegexp.main(TestRegexp.java:19)
    Est ce que quelqu'un pourrait me dire ce qui cloche s'il vous plait ? car normalement si j'ai bien compris le caractère ^ représente le début de chaine, donc je recherche bien le < en premier, ensuite l'étoile représente n'importe quel nombre de caractère et je referme avec le > en précisant le $ pour dire que c'est la fin.

    Merci de votre aide.

  2. #2
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut
    Je vois plusieur problèmes:

    Tout d'abord group() sert a obtenir le résultat d'une recherche, or tu as bien défini le matcher mais tu n'a pas lancé de recherche dessus.
    Tu dois utiliser soit match() pour vérifier si l'intégralité de ta chaine correspond à l'expression régulières, soit find() pour rechecher s'il y a des fragments de la chaine qui correspondent.
    Si ça te retourne true, c'est que le match/recherche a réussi et tu pourras utiliser group. Si l'expression n'a pas été trouvée, group n'a pas de sens et echoue.

    Ensuite, '*' signifie que le caractère ou groupe précédent peut être répété de 0 à l'infini. Si tu veux que n'importe quel caractère soit répété a l'infini, il faut utiliser '.*' car '.' signifie n'importe quel caractère.

    De plus '^<' signifie qu'il faut impérativement que le premier caractère après le début soit un '<' , or ce n'est visiblement pas ce que tu souhaites. De même '>$' indique que la ligne doit absolument se terminer par un '>'.

  3. #3
    Membre éclairé Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Points : 773
    Points
    773
    Par défaut
    en complément à ce qui a été dit, j'ajouterais que puisque tu veux récupérer le texte qui est sous la forme "<.*>" il faudrait le mettre dans des parenthèses pour pouvoir récupérer la chaine voulu par la méthode group(int index)

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    Merci beaucoup des réponses, de plus j'ai corrigé une autre erreur que j'avais fait, et maintenant ça marche niquel je vous remercie. Tout compte fait je n'avais pas super bien compris le fonctionnement de find() et de group(). Et puis il ne fallait pas que je mette le ^ et le $ (car un final ma chaine de caractère ne commence pas par <). Et merci pour la petite astuce du .* car je pensais que l'étoile suffisait, mais en y réfléchissant c'est vrai qu'à la lecture CA NE VEUT RIEN DIRE

    Je donne tout de même le code si ça peut aider quelqu'un :

    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
     
    public class TestRegexp {
     
    	public static void main(String[] args) {
     
    		Pattern pattern;
    		Matcher matcher;
    		boolean toto;
     
    		pattern = Pattern.compile("<.*>");
    		matcher = pattern.matcher("+OK bonjour <123567@monentreprise.com>");
    		toto = matcher.find();
    		if(toto)
    		System.out.println(matcher.group());
    	}
     
    }
    Merci à tous les 2, par contre herch je ne comprends pas pourquoi tu veux que j'utilise la version de group(int index), car dans tous les cas elle n'apparaitra qu'une seule fois.

  5. #5
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut
    Si tu veux récupérer l'intégralité de ton expression régulière, en effet ça ne te sert pas car group() sans paramètre correspond a group(0) qui contien toute l'expression.

    Par conte, tu souhaites peut-être récupérer des parties de l'expression. Tu pourrais par exemple utiliser "<(.*)@(.*)>" comme expression régulière.
    Ainsi:
    - group(1) retournerait "123567"
    - group(2) retournerait "monentreprise.com"

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    D'accord et bien merci de la réponse, c'est tout de suite moins flou pour moi

    Bonne journée à tous, je le passe en résolu.

  7. #7
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut
    Je rejouterai juste de te méfier du "*" qui est dit greedy : il consomme autant de caractère que possible tant que la regexp reste valide.
    Au contraire "*?" est dit reluctant : il consomme le minimum possible pour rendre la chaine valide.

    Par exemple sur la chaine "zzzzzzz<un>zzzzz<deux>zzzzzz
    - l'expression "<.*>" trouvera "<un>zzzzz<deux>"
    - l'expression "<.*?>" trouvera "<un>" au premier find() puis "<deux>" au second find()

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    Ok merci de la précision, (je pense tout de même que tu as dû te tromper dans ton code car c'est 2 fois la même chose). Par contre j'ai essayé ton exemple, en faisant soit : <.?> qui me renvoie une erreur ou j'ai essayé également <*?> qui ne me renvoie que le dernier caractère...

  9. #9
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut
    En effet, j'ai corrigé.

    Pour éviter les erreurs, teste le retour de find(). S'il retourne false c'est qu'il n'a pas trouvé de correspondance à l'expression régulière. Donc un appel a group() lèvera une erreur.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    Ouais c'est bon comme cela maintenant ça marche niquel (ça me donne le même résultat, mais je te fais confiance, tu m'as dit que c'était moins couteux, donc j'ai mis avec le ?).

    Bonne journée à tous, et merci pour ces réponses rapides.

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

Discussions similaires

  1. [RegExp] Petit problème avec les integers
    Par Rhend dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 10/10/2011, 19h19
  2. (encore) un problème avec les regexp (un peu subtile celui-là)
    Par sopsag dans le forum Général Python
    Réponses: 3
    Dernier message: 26/01/2010, 18h44
  3. Problème avec les apostrophes
    Par misterbillyboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/07/2003, 16h39
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  5. []Problème avec les formulaires Outlook
    Par davidinfo dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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