提问者:小点点

如何扫描和删除数组中的元素并返回数组?[闭门]


我正在尝试扫描电子邮件地址数组,并从数组中删除特定的域地址,然后返回它。

这是我的代码:

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个答案

匿名用户

使用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关于数组的文档,远离PHP的思维方式。

匿名用户

这种模式:

/(?:@(?: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如何显示它的。

下面是如何使用它:

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

如果需要不匹配的字符串:

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

如果需要匹配的字符串:

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

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