我试图搜索文本文件并找到有效的电子邮件地址。我做这样的事情:
#!/usr/bin/perl -w
my $infile = 'emails.txt';
open IN, "< $infile" or die "Can't open $infile : $!";
while( <IN> )
{
if ($infile =~ /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$/)
{
print "Valid \n";
}
}
close IN;
但它什么都没做,有什么帮助吗?
答案 0 :(得分:11)
您将电子邮件地址regex与文件名匹配。无论如何,你不应该使用正则表达式来验证电子邮件地址 - 使用Email :: Valid
use strict;
use Email::Valid;
my $infile = 'emails.txt';
open my $in, "< $infile" or die "Can't open $infile : $!";
while(my $line = <$in> ) {
chomp $line;
if (Email::Valid->address($line)) {
print "Valid \n";
}
}
close $in;
答案 1 :(得分:1)
您正在尝试匹配$ infile,其中包含文本文件的名称,即'emails.txt'。
你应该做类似
的事情while(<IN>) {
print "Valid \n" if $_ =~ /\bYOURREGEX\b/
}
这样\ b匹配单词边界而不是行的开头和结尾,您可以匹配另一个字符串中包含的电子邮件地址。
编辑:但是Jira的回答肯定更好,这个只是告诉你什么是错的。希望这有帮助!
答案 2 :(得分:1)
除非符合以下条件,否则您将遇到此正则表达式的问题:
您应该将所有A-Z
替换为\p{Alpha}
所有字母字符,只接受上限,无论大小写如何。将其与0-9
和_
合并的位置。您应该将其替换为\w
(任何字字符)。
/^[\w.%+-]+@[\p{Alnum}.-]+\.\p{Alpha}{2,6}$/
但这仍然不是电子邮件的有效正则表达式,请参阅Benoit's comment - 但它可能会在紧要关头完成工作。
答案 3 :(得分:0)
我不知道Perl,但你的正则表达式匹配整个字符串的开头和结尾。除非您设置多行标记和/或每个文件只有一个电子邮件地址,否则您将无法获得结果。
尝试删除^(字符串的开头)和$(字符串的结尾)标记,看看是否有帮助。
也可能有助于发布数据集样本。如果没有样品,我无法再帮助你。
答案 4 :(得分:0)
你不需要这样的东西吗?
@lines = <IN>;
close IN;
foreach $line (@lines)
{
...
}
答案 5 :(得分:0)
你知道, 是这里的the regex to validate RFC 5322 email addresses的副本。它看起来像这样:
$rfc5322 = qr{
# etc
}x;
我在上面提到的# etc
省略中有一两件事,您可以在另一个答案中查看。
顺便说一下,如果你要在你的正则表达中使用\b
,请特别小心,你知道它的触摸是什么。
$boundary_before = qr{(?(?=\w)(?<!\w)|(?<=\w))}; # like /\bx/
$boundary_after = qr{(?(?<=\w)(?!\w)|(?=\w))}; # like /x\b/
$nonboundary_before = qr{(?(?=\w)(?<=\w)|(?<!\w))}; # like /\Bx/
$nonboundary_after = qr{(?(?<=\w)(?=\w)|(?!\w))}; # like /x\B
这很少是人们所期待的。