[RegEx] Comment gérer les caractères d'échappement ?
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:
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 :)