如何使此正则表达式规则不区分大小写

AnA*_*ice 4 ruby regex ruby-on-rails ruby-on-rails-3

我正在做以下事情:

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? }
Run Code Online (Sandbox Code Playgroud)

问题是区分大小写.有没有办法让这一切都不区分大小写,而不必在每条规则的末尾添加/ i?

小智 9

使用选项"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
]
Run Code Online (Sandbox Code Playgroud)

在这里测试... http://rubular.com/

  • 这个答案中的正则表达式会泄漏字符,允许误报,因为`.`通配符.他们必须逃脱才能正常工作. (2认同)

Rya*_*wis 3

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] }
Run Code Online (Sandbox Code Playgroud)

也没有真正需要正则表达式:

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) }
Run Code Online (Sandbox Code Playgroud)

或者,您只能执行正则表达式:

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
Run Code Online (Sandbox Code Playgroud)