2010-05-12 10 views
3

Je souhaite extraire des adresses e-mail à partir d'un fichier texte volumineux. Quelle est la meilleure façon de le faire?Quel est le moyen efficace de trouver un motif dans un gros texte?

Mon idée est de trouver « @ » dans le texte et utiliser « Regex » pour trouver l'adresse e-mail en sous-chaîne à (par exemple) 256 caractères avant cette position et la longueur de 512.

PS: sans détour Je veux savoir le meilleur moyen et le plus efficace pour trouver un motif (comme les adresses e-mail) dans un texte énorme.

+0

[Comment trouver ou valider une adresse e-mail] (http: //www.regular -expressions.info/email.html) –

Répondre

1

256 et 512 sonnent comme des valeurs arbitraires.

  • Vous pouvez en effet rechercher le signe @, mais vous auriez à lire avant et vers l'arrière jusqu'à ce que vous rencontrez un personnage qui ne sont pas autorisés dans une adresse e-mail (par exemple, un autre @ signer, espaces blancs, une barre oblique inverse ...)
  • wikipedia cite:

La partie locale d'une adresse e-mail peut être jusqu'à 64 caractères et le nom de domaine peut avoir un maximum de 255 caractères.

Ces valeurs seraient donc plus agréables.

Maintenant combiner les deux méthodes et voila, vous avez votre algorithme.

+0

Il existe également une longueur maximale de 254 octets pour les adresses e-mail * dans toto *, comme spécifié dans la RFC5321. (Ceci est 256 y compris le '<' and '>' - http://tools.ietf.org/html/rfc5321#section-4.5.3.1.3) – porges

+0

Merci pour votre citation. 64 et 256 est tellement mieux que 256 et 512 :) – salman

0

La localisation de toutes les adresses e-mail valides n'est pas une chose facile à faire, car la RFC pour la syntaxe de l'adresse e-mail est quite complex. Si vous voulez juste pour localiser adresses e-mail normales, vous pouvez utiliser quelque chose comme:

/(?<=^|[\s<(\["'])[a-z][\w.+-][email protected][\w-]+(?:\.[\w-]+)+(?=[>)\]"']|$)/gi 

Cette regex suppose que:

  • Adresse e-mail commence par une lettre et ne contient que des caractères alphanumériques, période, traits de soulignement et tirets (et un @, bien sûr). Il permet + dans la partie nom.
  • Ils sont enfermés dans les espacements, les crochets, les parenthèses, les guillemets simples/doubles ou équerres

Il ne vérifie pas si les longueurs des parties de nom et domaine sont dans leur plage autorisée (et beaucoup d'autres contraintes définies par RFC). Testez-le sur un exemple de fichier et consultez le nombre d'e-mails qu'il correspond.

+0

Merci mais je sais utiliser de Regex. Ma question est de trouver l'adresse email dans un texte énorme plus que sur la regex de validation d'email. – salman

+1

@salman lit un ensemble de caractères à partir du fichier (délimité par des sauts de ligne, ou si votre texte est une énorme ligne, puis par des espaces), et teste chaque ensemble par rapport à l'expression rationnelle que vous maîtrisez. C'est simple. – Amarghosh

1

Cela dépend du nombre de faux positifs et de faux négatifs que vous voulez. Les adresses électroniques ont tendance à être composées de lettres, de chiffres et de certains symboles. Cependant, alors qu'il est probablement extrêmement rare de voir les caractères hors de cet ensemble dans une vraie adresse e-mail, la norme certainlyallows it. Vous avez donc vraiment besoin de décider combien de correspondances réelles vous voulez et combien de correspondances vous voulez qui correspondent à votre expression régulière, mais ne sont pas réellement des adresses e-mail.

est ici une réponse exclut de nombreux cas valides et comprend aussi probablement trop:

[A-Za-z0-9!#$%&*+-=?^_~]{1,64}@[A-Za-z0-9-.]{1,255}\.[A-Z]{2,6} 
+0

Merci mais je sais utiliser Regex. Ma question est de trouver l'adresse email dans un texte énorme plus que sur la regex de validation d'email. – salman

+0

Salman, pour moi cela ressemble à une contradiction dans les termes: une expression régulière est un moyen de trouver des adresses e-mail dans un corps de texte. Ce n'est peut-être pas le meilleur moyen, mais vous parlez d'un cas d'utilisation vraiment rare s'ils ne sont pas au moins «assez bons». –

+0

@ Tomislav, Straightforwardly Je veux savoir le meilleur moyen et le plus efficace pour trouver un motif (comme les adresses e-mail) dans un texte énorme. – salman

1

Si vous avez besoin absolument la façon la plus efficace, je ne pense pas que les expressions régulières devraient être utilisées.

En supposant que presque tous les cas de @ dans votre texte sont des adresses e-mail et que vous travaillez dans une langue avec une corde rapide vers l'avant et vers l'arrière traversal, cette méthode sera probablement proche de la plus rapide:

  1. Rechercher @
  2. comparer manuellement chaque caractère après le @ pour vous assurer qu'ils sont dans les plages ASCII autorisés
  3. Gardez une trace de savoir si un domaine valide a été trouvé avant le premier espace ou un autre valide caractère de fin
  4. Recherche supplémentaire du symbole @ en arrière, en comparant chaque personnage pour vous assurer qu'ils se situent dans la plage de caractères valable pour la composante locale
+0

Je dois programmer par C#. Est-ce bon pour travailler avec des cordes? – salman

Questions connexes