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

一方面,如果您试图从“随机”文本中提取地址,您不想将正则表达式锚定到行的开头和结尾 ( ^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

鉴于不可能使用正则表达式解析每个有效的电子邮件地址,因此您有两种选择:

制作一个匹配尽可能多的有效电子邮件地址的正则表达式,并忍受一些有效但很少使用的电子邮件地址形式可能会被忽略的事实。

或者

制作一个匹配任何“可能是”电子邮件地址的正则表达式,然后忍受误报

在验证网页上的用户注册电子邮件地址时,我使用第二种方法清除明显错误的电子邮件地址

从 Ruby Cookbook 收集,其中有一个关于电子邮件地址验证的非常好的部分:

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

显然有一个由 Paul Warren 编写的 6343 字符的 Perl 正则表达式,它做得非常好,也适用于 Ruby,但即使这样也不是万无一失的(我认为它也可能对性能有一些影响)。

于 2009-02-11T13:54:23.353 回答
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 回答
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 回答