Question

J'ai un affichage de webhook à un formulaire sur mon application web et je dois analyser les adresses d'en-tête de courrier électronique.

Voici le texte source:

Thread-Topic: test subject
Thread-Index: AcwE4mK6Jj19Hgi0SV6yYKvj2/HJbw==
From: "Lastname, Firstname" <firstname_lastname@domain.com>
To: <testto@domain.com>, testto1@domain.com, testto2@domain.com
Cc: <testcc@domain.com>, test3@domain.com
X-OriginalArrivalTime: 27 Apr 2011 13:52:46.0235 (UTC) FILETIME=[635226B0:01CC04E2]

Je cherche à tirer les éléments suivants:

<testto@domain.com>, testto1@domain.com, testto2@domain.com

Je suis été aux prises avec Regex toute la journée sans chance.

Était-ce utile?

La solution

Contrairement à certains des postes ici, je suis d'accord avec mmutz, vous ne pouvez analyser des courriels avec une expression régulière ... voir cet article:

http://tools.ietf.org/html/rfc2822#section- 3.4.1

3.4.1. spécification addr-spec

Un addr-spec est un Internet spécifique identificateur qui contient un localement chaîne interprétée suivie par la arobase caractère ( « @ », valeur ASCII 64) suivi d'un domaine Internet.

L'idée de « localement » signifie interprété que seul le serveur de réception devrait être en mesure de l'analyser.

Si je vais essayer de résoudre ce que je trouverais le contenu en ligne « A », le briser et de tenter d'analyser chaque segment avec System.Net.Mail.MailAddress.

    static void Main()
    {
        string input = @"Thread-Topic: test subject
Thread-Index: AcwE4mK6Jj19Hgi0SV6yYKvj2/HJbw==
From: ""Lastname, Firstname"" <firstname_lastname@domain.com>
To: <testto@domain.com>, ""Yes, this is valid""@[emails are hard to parse!], testto1@domain.com, testto2@domain.com
Cc: <testcc@domain.com>, test3@domain.com
X-OriginalArrivalTime: 27 Apr 2011 13:52:46.0235 (UTC) FILETIME=[635226B0:01CC04E2]";

        Regex toline = new Regex(@"(?im-:^To\s*:\s*(?<to>.*)$)");
        string to = toline.Match(input).Groups["to"].Value;

        int from = 0;
        int pos = 0;
        int found;
        string test;

        while(from < to.Length)
        {
            found = (found = to.IndexOf(',', from)) > 0 ? found : to.Length;
            from = found + 1;
            test = to.Substring(pos, found - pos);

            try
            {
                System.Net.Mail.MailAddress addy = new System.Net.Mail.MailAddress(test.Trim());
                Console.WriteLine(addy.Address);
                pos = found + 1;
            }
            catch (FormatException)
            {
            }
        }
    }

sortie à partir du programme ci-dessus:

testto@domain.com
"Yes, this is valid"@[emails are hard to parse!]
testto1@domain.com
testto2@domain.com

Autres conseils

La RFC 2822 compatible email est regex:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

il suffit de courir sur votre texte et vous obtiendrez les adresses e-mail.

Bien sûr, il y a toujours la possibilité de ne pas utiliser regex où regex n'est pas la meilleure option. Mais à vous!

Vous ne pouvez pas utiliser des expressions régulières pour analyser mails RFC2822, parce que leur grammaire contient une production récursif (du haut de ma tête, il était pour (a (nested) comment) commentaires) ce qui rend la grammaire non régulière. Les expressions régulières (comme son nom l'indique) ne peut analyser normal grammaires.

Voir aussi RegEx correspondent à des balises XHTML ouverts à l'exception autonome balises pour plus d'informations.

Comme Blindy suggère, parfois, vous pouvez simplement l'analyser la manière ancienne.

Si vous préférez le faire, voici une approche rapide en supposant que le texte d'en-tête de courrier électronique est appelé « tête »:

int start = header.IndexOf("To: ");
int end = header.IndexOf("Cc: ");
string x = header.Substring(start, end-start);

peut être désactivé par un octet sur la soustraction mais vous pouvez tester très facilement et de modifier cela. Bien sûr, vous devez aussi être certain que vous aurez toujours une Cc:. Ligne dans votre tête ou cela ne fonctionnera pas

Il y a une répartition des e-mails avec validation regex , qui fait référence à une mise en œuvre plus pratique de la RFC 2822 avec:

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

Il semble aussi que vous voulez que les adresses e-mail sur le champ « A », et vous avez le <> à se soucier aussi bien, donc quelque chose comme ce qui suit serait probablement le travail:

^To: ((?:\<?[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\>?,?(?:\s*))*)

Encore une fois, comme d'autres ayant mentionné, vous ne voulez pas le faire. Mais si vous voulez regex qui transformera cette entrée en <testto@domain.com>, testto1@domain.com, testto2@domain.com, ça va le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top