计算文本文件中电子邮件地址的出现次数

时间:2012-11-22 11:04:30

标签: regex string perl

我有一个包含标题的电子邮件的.txt文件。我只是想知道如何使用perl来查找在此文本文件中找到相同电子邮件地址的次数? 它会涉及正则表达式吗?

3 个答案:

答案 0 :(得分:5)

您可能会发现cpan: Email::Find有用。您可以将找到的地址存储在哈希表中,其中电子邮件作为键,计数器作为值。你应该能够通过回调来做到这一点。你可以开始这个吗?

答案 1 :(得分:2)

这个脚本怎么样:

#!/usr/bin/perl

use strict;
use Data::Dumper;

my @email_list = ();
my %count;

while (my $line = <>) {
    foreach my $email (split /\s+/, $line) {
        if ( $email =~ /^[-\w.]+@([a-z0-9][a-z-0-9]+\.)+[a-z]{2,4}$/i ) {

            push(@email_list,$email);
        }
    }
}

print "Total Email Count: ".scalar(@email_list)."\n\n";
$count{$_}++ for @email_list;
print Dumper(\%count);

将其保存到email.pl等文件中,并确保其可执行文件chmod +x email.pl

./email.pl file.txt

它将打印找到的电子邮件地址总数,并计算每个电子邮件地址的数量。

答案 2 :(得分:1)

如果您想查找所有电子邮件地址,我建议您尝试使用模块而不是编写自己的正则表达式。正确匹配所有电子邮件地址变得非常复杂。

但是,如果您只想搜索给定的电子邮件地址,可以使用相当简单的正则表达式完成此操作:

#!usr/bin/perl
use strict;
use warnings;

my $count = 0;
my $email = 'foo@bar.com';

while(<DATA>)
{
    $count++ while (m/(^|\s)\K\Q$email\E(?=\s|$)/g);
}

print "Found $email $count times";

__DATA__
foo@bar.com foo@bar.com

mr-foo@bar.com #not a match

old.foo@bar.com   #not a match
blah blah blah foo@bar.com blah blah
foo@bar.commmm #not a match

请注意,这需要通过空格将电子邮件地址与任何其他内容分开。

几点说明: \Q...\E是引用文字的转义。它确保电子邮件地址中的任何内容都不会被视为特殊的正则表达式字符(如果没有这个,.将匹配任何字符而不是文字句点。)

(?=...)是一个先行插入。这将匹配内容,而不包括在实际匹配中。这很重要,因为在一次发生电子邮件之前单个空格可能是,而之后。为了匹配这两者,你不希望第一场比赛“吃掉”那个空间。