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 mon expression régulière


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Avatar de romuluslepunk
    Homme Profil pro
    Juste passioné
    Inscrit en
    Avril 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Juste passioné

    Informations forums :
    Inscription : Avril 2005
    Messages : 174
    Par défaut Problème avec mon expression régulière
    Bonjour,

    j'utilise une expression reguliere pour trouver toutes les adresses emails qui se trouvent dans un fichier texte.

    Voici comment je procède :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    // texte ou je vais chercher les emails
    String texte;
     
    // arraylist ou je met les adresse trouvee
    ArrayList<String> liste = new ArrayList<String>(0);
     
    // creation de l'entree
    FileReader entree;
    try
    	{
    	entree = new FileReader("/emplacement/fichier.txt");
    	}
    catch (FileNotFoundException e)
    	{
    	throw new Exception("Impossible d'ouvrir le fichier", e);
    	}
     
    // parcourt le fichier
    int c;
    try
    	{
    	while ((c = entree.read()) != -1)
    		{
    		texte = texte + (char) c;
    		}
    	}
    catch (IOException e)
    	{
    	throw new Exception("Impossible de lire le fichier", e);
    	}
     
    // definition de la regexp
    Pattern aChercher = Pattern.compile("[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@" +
    		"[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[_A-Za-z0-9-]+)");
    Matcher chercheur = aChercher.matcher(texte);
     
    // recherche les adresse
    while (chercheur.find())
    	{
    	String email = chercheur.group();
    	liste.add(email);
    	}
    Celà marche nickel si mon fichier ne commence pas par une adresse genre :Mais j'ai un problème si le fichier commence par une adresse :
    adresse@mail.com blabla
    adresse2@mail.com
    Dans ce cas j'obtient :
    nulladresse@mail.com
    adresse2@mail.com
    J'ai pioché le pattern sur internet car je suis en bille mais je pense pas que cela vienne de sa...
    Je suis perdu, merci de m'eclairer

  2. #2
    Membre éprouvé Avatar de jean.2edi
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 106
    Par défaut
    Tu peux montrer le code d'affichage de ta liste ?
    Remarques :
    • Il vaut mieux définir ta liste comme une List :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      List<String> liste = new ArrayList<String>();
    • Pourquoi mettre tout ton fichier dans un buffer caractère par caractère ? Tu pourrais lire ligne par ligne et faire ta boucle de recherche par ligne...

  3. #3
    Membre éprouvé Avatar de jean.2edi
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 106
    Par défaut
    ... Expression régulière est une mauvaise traduction, on dit expression rationnelle ;-)

  4. #4
    Membre confirmé
    Avatar de romuluslepunk
    Homme Profil pro
    Juste passioné
    Inscrit en
    Avril 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Juste passioné

    Informations forums :
    Inscription : Avril 2005
    Messages : 174
    Par défaut
    Pour le test, j'ecris directment via println :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (Iterator<String> it = liste.ietrator(); it.hasNext();)
    	{
    	System.out.println(it.next());			
    	}
    Mais sinon j'affiche dans une JTable et le resultat est le meme.

    Caractère par caractère ou ligne par ligne reviens au meme non ?
    Je suppose que la methode qui retourne ligne par ligne lit les caractère 1 a 1 pour trouver une ligne donc il ne devrais pas y avoir de différence au niveau vitesse et ressource utilisé...
    Maintenant je me trompe peut être

  5. #5
    Membre confirmé
    Avatar de romuluslepunk
    Homme Profil pro
    Juste passioné
    Inscrit en
    Avril 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Juste passioné

    Informations forums :
    Inscription : Avril 2005
    Messages : 174
    Par défaut
    J'ai trouvé, c'est vraiment une erreur de débutant....
    En même temps j'y suis doc...

    A la place de déclarer ma string comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String texte;
    // je fais :
    String texte = "";
    En la declarant comme ceci elle etait null donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    texte = texte + (char) c;
    // revenait a faire
    texte = null + (char) c;
    // au 1er caractère
    C'est vraiment tout bête

    Merci de t'être penché sur mon cas,
    j'ai un peu honte quand même

  6. #6
    Membre éprouvé Avatar de jean.2edi
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 106
    Par défaut
    Il ne faut pas avoir honte : les erreurs les plus difficiles à trouver sont les plus simples...

    Si tu veux remplir une chaîne qui contient tout le contenu du fichier, ne fait pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    texte = texte + (char) c;
    ce qui crée une nouvelle chaine à chaque caractère ! Utilise un StringBuilder et un append() !

    Pourquoi pas la lecture caractères par caractères :
    • Si tu veux lire un caractère à la fois : pourquoi pas ! Mais toi tu veux lire des lignes !
    • Ensuite, tu va mettre en mémoire tout ton fichier alors que tu n'en as pas besoin, même si tu as beaucoup de mémoire, bof...
    • Avec un bon vieux BufferedReader, une boucle de readLine() et une recherche dans la ligne courante c'est plus propre...
    • Ton fichier est petit, ton code marche... mais il vaut mieux toujours bien faire...

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

Discussions similaires

  1. Problème avec mon expression régulière
    Par luffydu22 dans le forum Débuter
    Réponses: 6
    Dernier message: 16/07/2010, 14h32
  2. [RegEx] problème avec une expression régulière
    Par sissi25 dans le forum Langage
    Réponses: 2
    Dernier message: 19/04/2007, 09h12
  3. Problème avec une expression régulière
    Par Darkroro dans le forum Langage
    Réponses: 7
    Dernier message: 09/10/2006, 12h13
  4. [VB.net][vs2005] Problème avec les expressions régulières
    Par zouhib dans le forum Windows Forms
    Réponses: 13
    Dernier message: 22/06/2006, 15h56
  5. Problème avec les expressions régulières
    Par Premium dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 18/06/2006, 16h41

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