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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 688
    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 688
    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 émérite Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    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
    Membre averti
    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
    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
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 688
    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 688
    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
    Membre averti
    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
    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
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 688
    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 688
    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()

+ 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 Invité 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