0

这是我的电子邮件正则表达式的伪代码:多个字符 + 一个 @ 符号 + 多个字符 + 一个。符号 + 2 到 6 个字符的单词

此电子邮件之前和之后必须有 1 个空格,您可以每行有多个电子邮件,并阅读整个文件的电子邮件。

至今:

open (MYFILE, 'data.txt');
while (<MYFILE>) {
    chomp;
    my @words = split(' ');
    foreach my $word (@words) {  
        if($word =~ /.+@.+\..{2,6}/) {
            print "$_\n";  
        }
    }
}

我认为我的问题在于我的正则表达式以及我对文件的阅读。我想我把每一行都变成了一个字符串,因为一些结果像 blah@blah.com blah 出现了,所以这些词没有分开?

4

4 回答 4

3

使用电子邮件::有效

use Email::Valid;
open (MYFILE, 'data.txt');
while (<MYFILE>) {
    chomp;
    my @words = split(' ');
    foreach my $word (@words) {  
        if(Email::Valid->address($word)) {
            print "$word\n";  
        }
    }
}
于 2013-10-21T14:51:44.697 回答
1

我用我的:

^[a-zA-Z0-9]+(\.?[\*\+\-\_\=\^\$\#\!\~\?a-zA-Z0-9])*\.?\@([a-zA-Z0-9]+[a-zA-Z0-9\-]*[a-zA-Z0-9]+)(\.[a-zA-Z0-9]+[a-zA-Z0-9\-]*[a-zA-Z0-9]+)*\.(?:([a-zA-Z0-9]+)|([a-zA-Z0-9]+[a-zA-Z0-9\-]*[a-zA-Z0-9]+))$

我希望它有所帮助。干杯。

于 2015-06-15T18:15:21.723 回答
0

您的 print 语句不会打印 split 中的单词$word,它会在 split 之前打印原始行$_

print "$_\n";  

你可能想要的是

print "$word\n";
于 2013-10-21T14:52:46.170 回答
0
open (MYFILE, 'data.txt');
while (<MYFILE>) {
    chomp;
    my @words = split(' ');
    foreach my $word (@words) {
        if($word =~ /^[^@]+@+[^\.]+\.+[^\.]{2,6}$/) {
            print "$word\n";
        }
    }
}

首先,我想指出一些有效的电子邮件 IDmine@mine.co.uk不符合您的要求。因此,始终建议使用现有的工作模块。

regex如果您打算像我一样玩耍和学习,那么请考虑上面的代码。

我的 data.txt 文件如下所示:

me@me.com mine@mine.co.uk myself@email.net
me@me.com mine@mine.in myself@email.ru
me@me.com mine@mine.co.uk myself@email.america

输出

me@me.com
myself@email.net
me@me.com
mine@mine.in
myself@email.ru
me@me.com
于 2014-03-25T16:43:55.270 回答