我想使用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
(有两个或更多点)。
应排除这些地址。
如何修改此正则表达式以排除这些类型的电子邮件?
我只能使用一个表达式来执行此任务。
答案 0 :(得分:1)
电子邮件地址^%&blah@gmail.com
实际上是a valid email address。
您可以使用Email::Valid
module在Perl中执行此操作(假设每个条目都在新行上):
perl -MEmail::Valid -ne 'print if Email::Valid->address($_)' file1 file2
not email
abc@test.com
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'
只有当字符串前面没有字符(?<![%&^])
时,%&^
才会让正则表达式进一步匹配。