Одна проблема, которую я вижу в вашей текущей реализации, заключается в том, что она будет соответствовать доменам, таким как luvesouthwestlcom.com, потому что .
соответствует любому символу.Вы могли бы справиться с этим, избежав всех URL, которые вы используете, выполнив что-то вроде этого:
email = 'bob@luv.southwest.com'
domains = %w[craigslist.org evite.com ziprealty.com alleyinsider.com fedexkinkos.com luv.southwest.com fastsigns.com experts-exchange.com feedburner.com]
domain_rules = domains.map{|d| /#{Regexp.escape(d)}/i }
user, domain = email.split('@')
domain_rules.any? { |rule| domain.match(rule) }
Кроме того, если вы ищете только точные совпадения, вам не нужны регулярные выражения, и вы можетепроверьте, содержит ли домен электронной почты одну из строк, которые вы ищете.
email = 'bob@luv.southwest.com'
domains = %w[craigslist.org evite.com ziprealty.com alleyinsider.com fedexkinkos.com luv.southwest.com fastsigns.com experts-exchange.com feedburner.com]
user, domain = email.split('@')
domain.downcase! # lower cases the string in place
domains.any? { |rule| domain.include?(rule) }
Проблема с любой из них заключается в том, что они будут сопоставлять что-либо с точной строкой, поэтому 'craigslist.org'
будетсовпадение 'nyc.craiglist.org'
и 'craigslist.org.uk'
.Если вам нужны точные совпадения, вы можете просто использовать ==
после уменьшения входного домена.например,
domains.any? { |rule| domain == rule }