2010-11-24 12 views
1

テキストファイルを検索して有効なメールアドレスを見つけようとしています。このような何かをしているIm:テキストファイルから電子メールアドレスを検証しますか?

#!/usr/bin/perl -w 

my $infile = 'emails.txt'; 

    open IN, "< $infile" or die "Can't open $infile : $!"; 

    while(<IN>) 
    { 
     if ($infile =~ /^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,6}$/) 
     { 
      print "Valid \n"; 
     } 
    } 

    close IN; 

しかし、何か助けてくれませんか?

+1

有効な文字がないため、RFC 5322(http://tools.ietf.org/html/rfc5322)をお読みください – Benoit

+0

電子メールアドレスはどのように埋め込まれていますか? 1行に1つの完全なアドレス?他のデータに散在していますか? 1行に複数のアドレスを入れることはできますか?メールアドレスを複数の行に分割することはできますか? – Narveson

答えて

11

電子メールアドレスregexpとファイル名が一致しています。とにかくあなたは電子メールアドレスを検証するために正規表現を使用しないでください - 電子メールを使用する::有効な

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; 
+2

これが正しい答えである理由を拡大するために、http://www.ex-parrot.com/pdw/Mail-RFC822-Address.htmlは、電子メールアドレスを実際に検証するのに必要な正規表現です。 – Oesor

0

私はPerlを知らないが、あなたの正規表現は文字列全体の最初と最後に一致しています。複数行のフラグを設定している場合やファイルごとに1つの電子メールアドレスしか持たない場合を除き、結果は得られません。

^(文字列の先頭)と$(文字列の終わり)トークンを削除して、その文字列に役立つかどうかを確認してください。

データセットのサンプルを投稿するのに役立つかもしれません。サンプルがなければ私はそれ以上あなたを助けることができません。

0

このようなものは必要ありませんか?

@lines = <IN>; 
close IN; 

foreach $line (@lines) 
{ 
... 
} 
+0

これは、ファイルを配列にスラッシングしています。場合によってはスラップするのが良い理由がありますが、ほとんどの場合、ファイルを読むための最善の方法はjiraにあるとおりです。 – Narveson

1

あなたはすなわち「emails.txt」、テキストファイルの名前が含まれ、$ INFILEと一致するようにしようとしています。

あなたは

while(<IN>) { 
    print "Valid \n" if $_ =~ /\bYOURREGEX\b/ 
} 

のように、この方法は何かをする必要があります\ bは単語の境界の代わりに、先頭と行の末尾にマッチして、あなたは別の文字列内に含まれる電子メールアドレスを一致させることができます。

編集:しかし、ジラの答えは間違いなく良いです、これはちょうどあなたに何が間違っているかを伝えます。

希望すると便利です。

1

ない限り、この正規表現に問題があるでしょう:電子メールアドレスがファイルに電子メールアドレスがすべて大文字でファイル

  • のラインで唯一のものです

    あなたは、すべてのアルファベット文字に関係なく、例\p{Alpha}を持つ唯一のキャップを受け入れるすべてのA-Zを、交換する必要があります。どこに0-9_と組み合わせてください。代わりに\w(任意の文字)に置き換える必要があります。まだ

    /^[\w.%+-][email protected][\p{Alnum}.-]+\.\p{Alpha}{2,6}$/ 
    

    これは、しかし、Benoit's commentを参照してください - しかし、それはピンチで仕事をするかもしれませんが、電子メールの有効な正規表現ではありません。

  • 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 
    

    これはめったに人々が期待していることではありません。

    関連する問題