Bonjour à tous,

J'avoue avoir encore des difficultés à gérer les regex.
J'aurais donc besoin de vos conseils.

Je récupère une chaine de caractère sous la forme "nom" <email@email.com>
Je souhaiterai récupérer seulement le nom et l'email contenu dans cette chaine.

Simple me direz-vous !? Il suffit d'avoir un regex sous la forme suivante (ou quelquechose qui y ressemble fortement) :
Ok sans les caractères d'échapements !! En effet il est possible dans le nom d'avoir un guillemet. Dans ce cas là, un anti-slash nommé caractère d'échapement doit être avant le guillement.
Ex: "nom \"prenom\"" <email@email.com> est aussi une adresse valide. Et là, le bas blesse parce qu'il n'est pas possible d'utiliser une regex.

J'ai préféré donc le "gérer à la main" de la façon suivante :
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
    /**
     * Méthode qui à partir d'un header de mail retourne l'adresse mail<br>
     * pattern sous la forme "name" <email@email.com><br>
     * Caractère d'échapement : \ Le caractère à la suite d'un \ n'est pas pris en compte
     * @param header
     * @return
     */
    private static String retrieveEmailFromHeader(String header) {
    	StringBuffer nameBuffer = new StringBuffer();
    	StringBuffer mailBuffer = new StringBuffer();
    	boolean isName = false;
    	boolean isMail = false;    	   
    	int i = 0;
    	while (i < header.length()) {
    		if ((!isName) && (!isMail) && (header.charAt(i) == '\"')) {
    			isName = true;
    		} else if (isName && (header.charAt(i) == '\\')) {
    			i++;
    			if (i < header.length()) {
    				nameBuffer.append(header.charAt(i));
    			}     			
    		} else if (isName && (header.charAt(i) == '\"')) {
    			isName = false;
    		} else if (isName) {
    			nameBuffer.append(header.charAt(i));
    		} else if ((!isName) && (!isMail) && (header.charAt(i) == '<')) {
    			isMail = true;
    		} else if (isMail && (header.charAt(i) == '>')) {
    			isMail = false;
    		} else if (isMail) {
    			mailBuffer.append(header.charAt(i));
    		} 
   			i++;
    	}
    	log.debug("retrieveEmailFromHeader("+header+")="+nameBuffer+", "+mailBuffer);
    	return  mailBuffer.toString();   	
    }
Mon parseur gère parfaitement parfaitement les caractères d'échappement.

Est-il possible de faire la même chose avec un regex ?

Pour ma culture, merci