Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 从字符串中提取电子邮件的更鲁莽的方法?_Ruby - Fatal编程技术网

Ruby 从字符串中提取电子邮件的更鲁莽的方法?

Ruby 从字符串中提取电子邮件的更鲁莽的方法?,ruby,Ruby,我有下面的正则表达式和函数将电子邮件提取到一个数组中,当它工作时,对我来说似乎不太理想。对我如何批准这一点有什么建议吗 @emails = [] matches = @text_document.scan(/\+'(\S+@\S+|\{(?:\w+, *)+\w+\}@[\w.-]+)'/i) matches.each {|m| m[0].split(',').each {|email| @emails << email } } 产生以下输出: Rehearsal ------

我有下面的正则表达式和函数将电子邮件提取到一个数组中,当它工作时,对我来说似乎不太理想。对我如何批准这一点有什么建议吗

@emails = []
matches = @text_document.scan(/\+'(\S+@\S+|\{(?:\w+, *)+\w+\}@[\w.-]+)'/i)
matches.each {|m| m[0].split(',').each {|email| @emails << email  }  }
产生以下输出:

Rehearsal -------------------------------------------
inject:  11.030000   0.060000  11.090000 ( 11.145898)
concat:   9.660000   0.050000   9.710000 (  9.761068)
--------------------------------- total: 20.800000sec

              user     system      total        real
inject:  11.620000   0.060000  11.680000 ( 11.795601)
concat:  10.510000   0.050000  10.560000 ( 10.678999)

您可以重构
匹配项。每个
都可以:

matches.each {|m| @emails.concat(m[0].split(','))}
使用注入-

仅供参考,传递到块的变量、电子邮件指传入的空数组,输入指迭代时匹配的每个元素

编辑(如何使用注入):


@polymone:链接的电子邮件正则表达式很可怕。我不想成为那个图书馆的维护者。找到一个库,或者只是希望你不会得到像
hGy这样的地址∂@olé.museum
。我一点也不担心正则表达式,它是
匹配项。每个(|m|m[0]。拆分(',')。每个{}
我都想改进。我根本不在乎电子邮件是否有效。@mhenrixon:我更改了答案来回答你精炼的问题。我根本不担心正则表达式,它是匹配项。每个(| m | m[0]。拆分(',')。每个{}我想改进。我不在乎电子邮件是否有效。这实现了RFC822/RFC2822电子邮件规范。它还将许多电子邮件标记为“有效”有些邮件系统会拒绝这些内容,因为它们太疯狂了。理论上,你的电子邮件地址中可以有空格,但我从来没有在实践中使用过它。@mhenrixon:摆脱验证并给你一个解决方案。哈!现在我得到了两个很好的答案,在决定我更喜欢哪一个时遇到了问题。谢谢你的改进wer:)很好,不仅短,而且性能也很好。我更改了扫描以发送块中的匹配项,以摆脱另一个数组。当然,您也可以在一行中使用大括号来完成块。感谢您的提示!我对它进行了公平的运行,但由于@Linuxios solution的速度稍快,因此将被标记为answer。这是一个很好的基准测试。我敦促您您需要重新查看inject的文档并查看我的编辑,以便将来理解它,因为您使用它是错误的!非常感谢。我保证正确地学习inject!我一直想学习inject,但这是第一次,这对我来说是有意义的,再次感谢编辑的示例。我知道我哪里出了问题。
matches.each {|m| @emails.concat(m[0].split(','))}
@emails = matches.inject([]) do |emails, input| 
  emails += input.first.split(',')
end
REGEX = /\+'(\S+@\S+|\{(?:\w+, *)+\w+\}@[\w.-]+)'/i
def bm_inject
  emails = EMAILS.scan(REGEX).inject([]) do |arr, mails| 
    arr.concat mails.first.split(',')
  end
end