如何从数组中扫描和删除元素并返回数组?

时间:2014-01-03 05:46:10

标签: ruby arrays

我正在尝试扫描一组电子邮件地址并从阵列中删除特定的域名地址,然后将其返回。

这是我的代码:

matches = ["abuse@peterstar.net", "hostmaster@peterstar.net", "noc@peterstar.net", "noc@tristatevoicedata.com", "abuse@ripe.net", "dpereira@affiliatedtech.com"]
email = Array.new()
emails = Array.new()
matches.each do |email|
  if email != 'nobody@peterstar.com' && !email.match('@peterstar.net') && !email.match('@ripe.net') && !email.match('@arin.net') && !email.match('@lacnic.net') && !email.match('@afrinic.net')
    emails = email
    puts emails
  end
end
puts emails

这是脚本的输出:

dpereira@affiliatedtech.com

我需要如何返回一个删除了给定元素的数组。上面的脚本只返回数组的最后一个元素作为字符串。

提前致谢。

2 个答案:

答案 0 :(得分:1)

使用Regexp

re = /(^nobody@peterstar.com|@peterstar.net|@ripe.net|@arin.net|@lacnic.net|@afrinic.net)/
matches.select {| email | email !~ re }
# => ["noc@tristatevoicedata.com", "dpereira@affiliatedtech.com"]

包含一系列电子邮件和电子邮件模板:

res = [
  'nobody@peterstar.com',
  /@peterstar.net/,
  /@ripe.net/,
  /@arin.net/,
  /@lacnic.net/,
  /@afrinic.net/, ]
emails = matches.reject {| email | res.any? {| re | re === email } }
# => ["noc@tristatevoicedata.com", "dpereira@affiliatedtech.com"]
emails.last
# => "dpereira@affiliatedtech.com"

或使用卷积或缩减:

res = [
  'nobody@peterstar.com',
  /@peterstar.net/,
  /@ripe.net/,
  /@arin.net/,
  /@lacnic.net/,
  /@afrinic.net/, ]
  matches.reduce(nil) {| email, match | !res.any? {| re | re === match } && match || email }
  # => "dpereira@affiliatedtech.com"

请同时参考ruby documentation on Arrays,并远离PHP的思维方式。

答案 1 :(得分:0)

这种模式:

/(?:@(?:a(?:frinic|rin)|peterstar|lacnic|ripe)\.net|nobody@peterstar\.com)/i

匹配您的列表:

if email != 'nobody@peterstar.com' && !email.match('@peterstar.net') && !email.match('@ripe.net') && !email.match('@arin.net') && !email.match('@lacnic.net') && !email.match('@afrinic.net')

以下是Rubular displays it

的方式

以下是如何使用它:

MATCHES = %w[
  abuse@peterstar.net
  hostmaster@peterstar.net
  noc@peterstar.net
  noc@tristatevoicedata.com
  abuse@ripe.net
  dpereira@affiliatedtech.com
]
REGEX = /(?:@(?:a(?:frinic|rin)|peterstar|lacnic|ripe)\.net|nobody@peterstar\.com)/i

如果您想要 NOT 匹配的字符串:

MATCHES.reject{ |s| s[REGEX] }
# => ["noc@tristatevoicedata.com", "dpereira@affiliatedtech.com"]

如果您想要 DO 匹配的字符串:

MATCHES.select{ |s| s[REGEX] }
# => ["abuse@peterstar.net",
#     "hostmaster@peterstar.net",
#     "noc@peterstar.net",
#     "abuse@ripe.net"]

该模式使用i标志来强制不区分大小写,这在处理电子邮件地址时很重要,因为它们不区分大小写。