Как сделать это правило регулярных выражений нечувствительным к регистру - PullRequest
4 голосов
/ 02 мая 2011

Я делаю следующее:

email = 'bob@luv.southwest.com'

domain_rules = [/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_rules.each { |rule| return true if !domain.match(rule).nil? }

Проблема в том, что это с учетом регистра. Есть ли способ сделать все это без учета регистра без добавления / i в конец каждого отдельного правила?

Ответы [ 6 ]

9 голосов
/ 02 мая 2011

Используйте опцию "i" (игнорировать регистр)

domain_rules = [
  /craigslist.org/i,
  /evite.com/i,
  /ziprealty.com/i,
  /alleyinsider.com/i,
  /fedexkinkos.com/i,
  /luv.southwest.com/i,
  /fastsigns.com/i,
  /experts-exchange.com/i,
  /feedburner.com/i
]

проверить это здесь ... http://rubular.com/

3 голосов
/ 02 мая 2011

downcase адрес электронной почты и домен, который вы хотите сначала найти, затем find_all соответствие регулярному выражению.

Вы можете использовать find, чтобы получить только первое соответствующее «правило».

email = 'bob@luv.southwest.com'

domain_rules = [/craigslist.org/, /evite.com/, /ziprealty.com/, /alleyinsider.com/, /fedexkinkos.com/, /luv.southwest.com/, /fastsigns.com/, /experts-exchange.com/, /feedburner.com/]
user, domain = email.split('@').collect { |s| s.downcase }
p domain_rules.find_all { |rule| domain[rule] }

Также нет необходимости в регулярных выражениях:

email = 'bob@luv.southwest.com'

matchable_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.downcase.split('@')
p matchable_domains.find_all { |rule| matchable_domains.include?(domain) }

Или вы можете сделать ТОЛЬКО регулярное выражение:

email = 'bob@luv.southwest.com'
regexp = /[A-Z0-9._%+-]+@(craigslist\.org|evite\.com|ziprealty\.com|alleyinsider\.com|fedexkinkos\.com|luv\.southwest\.com|fastsigns\.com|experts-exchange\.com|feedburner\.com)/

p regexp === email # => true
p regexp.match(email) # => #<MatchData "bob@luv.southwest.com" 1:"bob" 2:"luv.southwest.com">il
1 голос
/ 02 мая 2011

Нет необходимости использовать регулярные выражения для простого сравнения строк.

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, user_domain = email.split('@')

p domains.any? { |domain| domain.casecmp(user_domain).zero? }

String.casecmp выполняет сравнение без учета регистра.

1 голос
/ 02 мая 2011

Одна проблема, которую я вижу в вашей текущей реализации, заключается в том, что она будет соответствовать доменам, таким как 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 }
1 голос
/ 02 мая 2011

Вы можете просто сделать адрес электронной почты строчными.

0 голосов
/ 02 мая 2011

Вы можете передать правила в виде простых строк и создать регулярное выражение на лету:

email = 'bob@luv.southwest.com'

domains = %w(craigslist.org evite.com ziprealty.com) # etc
user, domain = email.split('@').collect { |s| s.downcase }

p domains.any? { |d| domain.match(/#{d}/i) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...