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 :

[Regex]Parsage du contenu d'un mail, header fields


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 Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Par défaut [Regex]Parsage du contenu d'un mail, header fields
    Bonjour à tous
    Je viens vers vous car je n'arrive pas à trouver mon erreur. Comprenez : Ma regex "fonctionne", mais à moitié. Je voudrais que lorsqu'elle voit la ligne

    CRLF
    Content-Type: text/plain; charset=ISO-8859-1; format=flowed; delsp=yesCRLF

    Elle me sorte comme groupes

    Content-Type
    text/plain
    charset
    ISO-8859-1
    format
    flowed
    delsp
    yes


    Or, j'ai remarqué qu'elle ne me sors jamais les groupes "intérieurs". Au lieu du résultat ci-dessus, j'ai

    Content-Type
    text/plain
    delsp
    yes


    Les deux sections centrales ne sont pas répertoriées... Pourquoi ?

    Voici mon code entier :
    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
     
    public class RegexParser {
      public static void main(String[] args) throws Exception {
        Pattern p = Pattern.compile(
          "^(Content-Type):(?:[ \t]|\r\n )*((?:\r\n |[^;\r\n])+)(?:(?:[ \t]|\r\n )*;(?:[ \t]|\r\n )*(\\w*)=((\r\n |[^\r\n\\s])+))*\r\n", 
          Pattern.MULTILINE);
     
        //...
        // Le String s contient le mail, c'est le bon, rigoureusement testé.
     
        Matcher m = p.matcher(s);
        while (m.find()) {
          System.out.println("Matched: -" + m.group() + "-");
          for (int i = 1; i < m.groupCount(); i++)
            System.out.println("\tgroup" + i + ": -" + m.group(i) + "-");
        }
      }
    }
    Il doit y avoir une erreur avec les ?:. Pouvez-vous m'éclairer ? Ce serait vraiment sympa de votre part, car le parsing d'email c'est juste horrible :s

    EDIT/ Si vous voulez tester sur un vrai mail, essayez avec le fichier joint qui contient plusieurs Content-Type.
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur
    Avatar de paissad
    Homme Profil pro
    Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Inscrit en
    Avril 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 043
    Par défaut
    Bonjour,
    Je te propose de lire ton fichier ligne par ligne (je suppose que tu sais faire)
    Ensuite pour chaque ligne, tu fais un String.split()
    Voici la regex pour le split:
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("tmp/mail.txt")));
            String line = null;
            final Pattern pattern = Pattern.compile("^\\s*Content-Type\\b");
            while ((line = reader.readLine()) != null) {
                final Matcher matcher = pattern.matcher(line);
                if (matcher.find()) {
                    final String[] result = line.split("(\\s*(:|;|=)\\s*)");
                    for (String s : result)
                        System.out.println(s);
                } else {
                    System.out.println(line);
                }
            }
    Pense à faire les try/catch/finally quand même ^^ etc etc ...

    Cordialement,
    Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
    Le chat du site est aussi ici pour aider. Ne pas hésiter à visiter !

  3. #3
    Membre confirmé Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Par défaut
    Rooooh merci beaucoup, je n'avais pas pensé à faire comme ça, tellement obnubilé par mes recherches sur Regex... Merci !

  4. #4
    Modérateur
    Avatar de paissad
    Homme Profil pro
    Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Inscrit en
    Avril 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 043
    Par défaut
    Oui, mais bon, le String.split(); prend un regex en paramètre aussi Cf Javadoc
    Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
    Le chat du site est aussi ici pour aider. Ne pas hésiter à visiter !

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

Discussions similaires

  1. [Mail] Header et Timeout
    Par hisy dans le forum Langage
    Réponses: 9
    Dernier message: 21/12/2006, 22h17
  2. [Mail] mail : headers dans le corps du mail !?
    Par tytom dans le forum Langage
    Réponses: 1
    Dernier message: 24/08/2006, 12h44
  3. [VB]recuperer le contenu de mes mails
    Par mick84m dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 17/03/2006, 11h07
  4. [Mail] header "From:" avec mail()
    Par oranoutan dans le forum Langage
    Réponses: 16
    Dernier message: 16/12/2005, 15h49
  5. [Mail] Lire le contenu d'un mail
    Par hdd dans le forum Langage
    Réponses: 5
    Dernier message: 31/10/2004, 13h30

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