2011-05-13 4 views
2

Ive a obtenu quelques problèmes avec regex pour cette ecriture lignes dans Exim journalperl pour regexp adresse mail

1. 2011-05-12 11:30:26 1QKRHt-0001aD-Vd => mail <[email protected]> F=<[email protected]> bla bla 
2. 2011-04-22 12:01:31 1QDCF0-0002ss-Nw => /var/mail/mail <[email protected]> F=<[email protected]> bla bla 
3. 2011-05-12 11:29:01 1QKRGU-0001a5-Ok => [email protected] F=<[email protected]> bla bla 

et je veux mettre à la variable ce [email protected] dans une expression rationnelle. ive tryed utiliser Lile logique ceci: trouver la dernière chaîne avant « F = », et séparés par des espaces blancs peut être bloqué dans <>

Pouvez-vous me aider à écrire cette logique?

+2

Si vous voulez valider les adresses e-mail selon [RFC 822] (http://www.ietf.org/rfc/rfc0822.txt?number=822) c'est [pas facile du tout, une bonne regex est awesomely long] (http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html) – Benoit

Répondre

2

Vous pouvez utiliser les expressions régulières suivantes:

# the line should be in variable $line 
if ($line =~ /.*?\s+<?(\S+?)>?\s+F=/) { 
    # ... 
} 

Et il est une bonne idée de valider votre correspondance avec Mail-RFC822-Address module Perl, donc le code complet pourrait être:

use Mail::RFC822::Address qw(valid); 

# the line should be in variable $line 
if ($line =~ /.*?\s+<?(\S+?)>?\s+F=/) { 
    if (valid($1)) { 
    # ... 
    } 
} 
+0

ive utilisé ce paquet pour valider les emails. et le vôtre travaille en regexp. vous avez contribué à ce projet: D https://github.com/mealstrom/plp2sql/ les e-mails sont valides car ils sont déjà dans le journal. – MealstroM

0

Voici un e-mail de validation Regex

\b[\w\.-][email protected][\w\.-]+\.\w{2,4}\b 

Il extraira un e-mail où que vous soyez.

J'espère que ce RFC2822 poster correctement.

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

Je pense qu'il manque quelques crochets dans la partie après le '@' pour définir les classes de caractères – stema

+0

Il ne semblerait pas afficher, a continué à se couper pour une raison quelconque. J'en ai ajouté un autre à la place. –

+0

c'est non standard. Par exemple 'foo + bar @ gmail.com' est une adresse e-mail valide, et vous ne la prenez pas en charge. Voir [ceci!] (Http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html) – Benoit

1

Utilisation:

/(?<=<)\S*(?=>\s*F=)/ 

La syntaxe (?<= xxx) est une assertion arrière, et l'(?= xxx) est une assertion avant.

Ceci ne vérifie pas la validité de l'adresse e-mail, il suffit d'extraire cette partie de la ligne.