2011-06-21 6 views
2

私は文書から電子メールアドレスを抽出する短いクラスを作成しています。ここに私のコードは、これまでのところです:Ruby正規表現が一致しません

# Class to scrape documents for email addresses 

class EmailScraper 

    EmailRegex = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 

    def EmailScraper.scrape(doc) 
    email_addresses = [] 
    File.open(doc) do |file| 
     while line = file.gets 
     temp = line.scan(EmailRegex) 

     temp.each do |email_address| 
      puts email_address 
      emails_addresses << email_address 
     end 

     end 
    end 
    return email_addresses 
    end 
end 


if EmailScraper.scrape("email_tests.txt").empty? 
    puts "Empty array" 
else 
    puts EmailScraper.scrape("email_tests.txt") 
end 

マイ「email_tests.txt」ファイルには、そうのようになります。

[email protected] 
[email protected] 
[email protected] 

私はこのスクリプトを実行すると、私が得るすべては「空の配列」プリントアウトです。しかし、irbを起動して上の正規表現を入力すると、電子メールアドレスの文字列が一致し、String.scan関数は各文字列のすべての電子メールアドレスの配列を返します。これはなぜ私のスクリプトではなくirbで動作していますか?

答えて

3

いくつかのこと(一部すでに以下の時に言及して拡大):IO番号を取得する文字列の最後に

  • \zマッチは、通常\n文字が含まれます。 で終わる文字列がで終わらない限り、(大文字の 'z')は文字列の終わりに一致します。行全体であるか、または電子メールアドレスではありませんしながら、
  • \A\Zを使用してemails_addresses
  • のタイプミスで結構です。あなたは文書からアドレスを抽出しようとしていると言いますから、単語の境界で区切られた電子メールを抽出するには、それぞれの端に\bを使用することを検討します。
  • あなたは私は正規表現で確信していない、むしろ不器用に見えるFile.open...while...gets
  • よりもFile.foreach()...を使用することができます - 仕事のかなりの体はすでに周りにあります:

ここに賢く1あります:http://www.regular-expressions.info/email.htmlは(その奇妙な小さなインラインアイコンをクリックするとpiece-by-piece explanationに移動します)。いくつかの潜在的な落とし穴を指摘するディスカッションを読む価値があります。

さらに驚くほど複雑なものはhereです。

class EmailScraper 

    EmailRegex = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\Z/i # changed \z to \Z 

    def EmailScraper.scrape(doc) 

    email_addresses = [] 

    File.foreach(doc) do |line| # less code, same effect 
     temp = line.scan(EmailRegex) 
     temp.each do |email_address| 
     email_addresses << email_address 
     end 
    end   
    email_addresses # "return" isn't needed 
    end 
end 

result = EmailScraper.scrape("email_tests.txt") # store it so we don't print them twice if successful 
if result.empty? 
    puts "Empty array" 
else 
    puts result 
end 
+0

「\ z」と「\ Z」の違いを説明するための+1はそれを知らなかった。 – stema

3

あなたはemails_addressesに結果を入れているようですが、email_addressesを返しています。これは、email_addressのために定義した空の配列を常に返していることを意味し、 "Empty array"レスポンスが正しいことを意味します。

0

あなたがしてみてください、タイプミスがあります

class EmailScraper 

    EmailRegex = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 

    def EmailScraper.scrape(doc) 
    email_addresses = [] 
    File.open(doc) do |file| 
     while line = file.gets 
     temp = line.scan(EmailRegex) 

     temp.each do |email_address| 
      puts email_address 
      email_addresses << email_address 
     end 

     end 
    end 
    return email_addresses 
    end 
end 


if EmailScraper.scrape("email_tests.txt").empty? 
    puts "Empty array" 
else 
    puts EmailScraper.scrape("email_tests.txt") 

end 
0

あなたが最後\zで使用し、それが文字列の末尾に一致するように大文字のZでなければならhttp://www.regular-expressions.info/ruby.htmlに応じ\Z使用するようにしてください。あなたがファイルを読み込むとき

そうでなければ、これは私のためhere on Regexr

0

を働いた(開始と行の末尾にマッチする)^$を使用しようと、行の最後には、正規表現は失敗作っています。 irbでは、おそらく終わりがありません。そのような場合は、最初に行をコンパイルしてください。

regex=/\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
line_from_irb = "[email protected]" 
line_from_file = line_from_irb +"/n" 

p line_from_irb.scan(regex) # => ["[email protected]"] 
p line_from_file.scan(regex) # => [] 
関連する問題