1 votes

Comment regrouper plusieurs adresses électroniques et noms d'utilisateur à l'aide d'une expression régulière ?

J'ai le texte suivant que j'essaie d'analyser :

"user1@emailaddy1.com" <user1@emailaddy1.com>, "Jane Doe" <jane.doe@ addyB.org>,
"joe@company.net" <joe@company.net>

J'utilise le code suivant pour essayer de diviser la chaîne :

Dim groups As GroupCollection
Dim matches As MatchCollection
Dim regexp1 As New Regex("""(.*)"" <(.*)>")
matches = regexp1 .Matches(toNode.InnerText)
For Each match As Match In matches
    groups = match.Groups
    message.CompanyName = groups(1).Value
    message.CompanyEmail = groups(2).Value
Next

Mais cette expression régulière est gourmande et saisit toute la chaîne jusqu'au dernier guillemet après "joe@company.net". J'ai du mal à trouver une expression qui permette de regrouper cette chaîne dans les deux groupes que je recherche : Le nom (entre guillemets) et le courriel (entre crochets). Quelqu'un a-t-il des conseils ou des suggestions pour modifier l'expression rationnelle afin d'obtenir ce dont j'ai besoin ?

2voto

Lee Points 6659

Plutôt que de créer votre propre expression régulière, je ferais ceci :

string[] addresses = toNode.InnerText.Split(",");
foreach(string textAddress in addresses)
{
    textAddress = address.Trim();
    MailAddress address = new MailAddress(textAddress);
    message.CompanyName = address.DisplayName;
    message.CompanyEmail = address.Address;
}

Bien que votre expression régulière puisse fonctionner pour les quelques cas de test que vous avez montrés. L'utilisation de l'expression régulière MailAddress sera probablement beaucoup plus fiable à long terme.

1voto

sepp2k Points 157757

Pourquoi pas """([^""]*)"" <([^>]*)>" pour l'expression rationnelle ? C'est-à-dire qu'il faut explicitement préciser que la partie recherchée n'inclura pas de guillemets ou de parenthèses fermantes. Vous pouvez également utiliser une plage de caractères plus restrictive.

0voto

Matthieu Points 2091

Vous devez spécifier que vous voulez l'expression minimale correspondante. Vous pouvez également remplacer les motifs (.*) par des motifs plus précis : Par exemple, vous pouvez exclure la virgule et l'espace... En général, il est préférable d'éviter d'utiliser .* dans une expression régulière, car cela réduit les performances !

Par exemple, pour le courrier électronique, vous pouvez utiliser un modèle tel que [ \w -]+@([ \w -]+.)+[ \w -]+ ou plus complexe.
Vous pouvez trouver de bons modèles sur : http://regexlib.com/

0voto

Wgaffa Points 136

Je ne suis pas sûr du moteur de regexp utilisé par ASP.net, mais essayez la variante non gourmande en ajoutant un ? dans la regex.

Exemple d'expression rationnelle

""(.*?)"" <(.*?)>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X