4.16 解析文本中的电子邮件地址和URL

从给定的文件中解析出所需要的文本是我们从事文本处理时常见的一项任务。诸如电子邮件地址、URL等都能够借助适合的正则表达式找出来。在大多数情况下,我们需要从一个包含大量无关字符及单词的电子邮件客户列表或HTML网页中将电子邮件地址解析提取出来。

4.16.1 预备知识

这个问题可以用egrep解决。

4.16.2 实战演练

能够匹配一个电子邮件地址的egrep正则表达式如下:

  1. [A-Za-z0-9.]+@[A-Za-z0-9.]+\.[a-zA-Z]{2,4}

例如:

  1. $ cat url_email.txt
  2.  
  3. this is a line of text contains,<email> #slynux@slynux.com. </email>
  4. and email address, blog "http://www.google.com", test@yahoo.com
  5.  
  6. dfdfdfdddfdf;cool.hacks@gmail.com<br />
  7.  
  8. <ahref="http://code.google.com"><h1>Heading</h1>
  9.  
  10.  
  11. $ egrep -o '[A-Za-z0-9.]+@[A-Za-z0-9.]+\.[a-zA-Z]{2,4}' url_email.txt
  12. slynux@slynux.com
  13. test@yahoo.com
  14. cool.hacks@gmail.com

匹配一个HTTP URL的egrep正则表达式如下:

  1. http://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4}

例如:

  1. $ egrep -o "http://[a-zA-Z0-9.]+\.[a-zA-Z]{2,3}" url_email.txt
  2. http://www.google.com
  3. http://code.google.com

4.16.3 工作原理

如果逐个部分进行设计的话,这些正则表达式其实很简单。在匹配电子邮件地址的正则表达式中,我们都知道电子邮件地址可以采用name@domain.some_2-4_letter这样的形式。那么,在编写正则表达式时,也要遵循同样的规则:

  1. [A-Za-z0-9.]+@[A-Za-z0-9.]+\.[a-zA-Z]{2,4}

[A-Za-z0-9.]+ 表示在表示字面意义的字符 @ 出现之前,[]中的字符组合应该出现一次或多次(这也正是 + 的含义)。然后 [A-Za-z0-9.] 同样应该出现一次或多次(+)。样式 . 表示应该呈现一个表示字面意义的“.”(点号),而[a-zA-Z]{2,4}表示字母的长度应该在2到4之间(包括2和4)。

匹配HTTP URL与匹配电子邮件地址类似,只是不需要匹配name@部分。

  1. http://[a-zA-Z0-9.]+\.[a-zA-Z]{2,3}

4.16.4 参考

  • 4.6节讲解了sed命令。

  • 4.2节讲解了如何使用正则表达式。