用于在文件中处理电子邮件的正则表达式

时间:2014-06-05 09:24:00

标签: regex bash shell grep

我想使用bash验证目录中文本文件的电子邮件。

我的正则表达式:

grep -Eoh \
         "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,8}\b" * \
         | sort -u > mail_list

此正则表达式满足我的所有要求,但不能排除以下地址:

^%&blah@gmail.com

with.dot@sale..department.company-name.com

(有两个或更多点)。

应排除这些地址。

如何修改此正则表达式以排除这些类型的电子邮件?
我只能使用一个表达式来执行此任务。

2 个答案:

答案 0 :(得分:1)

电子邮件地址^%&blah@gmail.com实际上是a valid email address

您可以使用Email::Valid module在Perl中执行此操作(假设每个条目都在新行上):

perl -MEmail::Valid -ne 'print if Email::Valid->address($_)' file1 file2

文件1

not email
abc@test.com

file2的

not email
def@test.com
^%&blah@gmail.com
with.dot@sale..department.company-name.com

输出

abc@test.com
def@test.com
^%&blah@gmail.com

答案 1 :(得分:0)

试试这个正则表达式:

'\b[A-Za-z0-9]+[A-Za-z0-9._%+-]+@([A-Za-z0-9-]+\.)+[A-Za-z]{2,8}\b'

我在前面添加了一个字母数字组,强制电子邮件以至少一个字母或数字开头,之后他们也可能有符号。

@符号后,我添加了一个可以包含任意数量的字母或数字的组,然后是一个时段。但是,该组可以重复多次,因此能够匹配long.domain.name.com

最后,正则表达式以您拥有的最终字符串结束,例如'com'


更新

由于\b与单词边界匹配,并且符号^%&不被视为单词' blah'的一部分,但上述内容仍将匹配blah@gmail.com它之前是不受欢迎的字符。要避免这种情况,请使用Negative Lookbehind。这需要使用grep -P代替-E

grep -P '(?<![%&^])\b[A-Za-z0-9]+[A-Za-z0-9._%+-]+@([A-Za-z0-9-]+\.)+[A-Za-z]{2,8}\b'

只有当字符串前面没有字符(?<![%&^])时,%&^才会让正则表达式进一步匹配。