4

まだ解決されていません :(   [2 月 11 日]

ランダム データでいっぱいの大きなテキスト ファイルがあり、そこからすべての電子メール アドレスを抽出したいと考えています。

次のような疑似コードを使用して、Ruby でこれを行いたいと思います。

monster_data_string = "asfsfsdfsdfsf  sfda **joe@example.com** sdfdsf"
monster_data_string.match(EMAIL_REGEX)

これを達成するために使用するRubyメールの正規表現を誰か知っていますか?

これに対するRubyの回答を探していることを覚えておいてください。グーグルで見つけた多数の正規表現をすでに試しましたが、それらのほとんどは、「+」や「」などの文字が無効/認識されないことを示すRubyランタイムエラーを引き起こします.*

私がすでに試したことは次のとおりです。

monster_data_string.match(/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i)

しかし、「+」は無効な文字であるという Ruby エラーが表示されます

前もって感謝します

4

6 に答える 6

14

これを見て...

f =  File.open("content.txt")
content = f.read    
r = Regexp.new(/\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b/)     
emails = content.scan(r).uniq                                    
puts YAML.dump(emails)    
于 2009-09-21T06:34:55.663 に答える
3

+正規表現が無効である、または無効であるというエラー メッセージが表示*される場合は、何か非常に間違っています。これはRubyで有効な正規表現ですが、あなたが望むものではありません:

/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i

1つには、「ランダムな」テキストからアドレスを抽出しようとしている場合、正規表現を行頭と行末 ( ^and )に固定したくない場合があります。$しかし、アンカーを取り除くと、正規表現は**joe@example.comテスト文字列で一致します。これは望ましくないと思います。このRegular-Expressions.infoの正規表現の方が優れていますが、特定のニーズに合わせて調整するためのヒントについては、そのページを参照してください。

/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i

最後に (すでにご存知かもしれませんが)、このメソッドは最初の一致match()しか見つからないため、使用したくありません。代わりに試してください。scan()

于 2009-02-12T10:31:32.610 に答える
1

どのようなランタイム エラー メッセージが表示されますか? 正規表現が無効であると見なされていますか、それともターゲット文字列が大きすぎるために壊れていますか?

于 2009-02-12T00:10:45.317 に答える
1

あなたがそこにたどり着くのを助けるために(あまりエレガントではありませんが、私は認めます):

開始アンカーと終了アンカー (^ と $) は役に立たないと思います。アスタリスクをフィルタリングすることもできますか?:

irb(main):001:0> mds = "asfsfsdfsdfsf  sfda **joe@example.com** sdfdsf"
  => "asfsfsdfsdfsf  sfda **joe@example.com** sdfdsf"
irb(main):003:0> mds.match(/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i)
  => nil
irb(main):004:0> mds.match(/([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})/i)
  => #<MatchData "**joe@example.com" 1:"**joe" 2:"example.com">
irb(main):005:0> mds.match(/([^@\s*]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})/i)
  => #<MatchData "joe@example.com" 1:"joe" 2:"example.com">
于 2009-02-12T08:53:55.730 に答える
1

正規表現を使用してすべての有効な電子メール アドレスを解析することはできないため、次の 2 つの選択肢が残されます。

できるだけ多くの有効な電子メール アドレスに一致する正規表現を作成し、有効ではあるがめったに使用されない形式の電子メール アドレスが見落とされる可能性があるという事実を受け入れます。

また

電子メールアドレスである可能性があるものすべてに一致する正規表現を作成し、誤検知を受け入れる

私は 2 番目のアプローチを使用して、Web ページでユーザーのサインアップ用メール アドレスを検証するときに、明らかに間違ったメール アドレスを除外します。

メールアドレスの検証に関する非常に優れたセクションがある Ruby Cookbook から収集されました。

valid = '[^ @]+'
/^#{valid}@#{valid}\.#{valid}/

どうやら、Paul Warren によって書かれた 6343 文字の Perl regexp があり、これは非常にうまく機能し、Ruby でも動作しますが、それでも絶対確実ではありません (パフォーマンスへの影響もあると思います)。

于 2009-02-11T13:54:23.353 に答える
0

さらに良いことに、

require 'yaml'

content = "asfsfsdfsdfsf  sfda **joe@example.com.au** sdfdsf cool_me@example.com.fr"

r = Regexp.new(/\b([a-zA-Z0-9._%+-]+)@([a-zA-Z0-9.-]+?)(\.[a-zA-Z.]*)\b/)     
emails = content.scan(r).uniq                                    
puts YAML.dump(emails)

あなたにあげます

    ---
    - - ジョー
      - 例
      -.com.au
    - - 私を冷やします
      - 例
      -.com.au
于 2010-09-25T04:02:35.633 に答える