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

问题描述:

我做了以下内容:如何使这种正则表达式规则不区分大小写

email = '[email protected]' 

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添加到每条规则的末尾?

downcase电子邮件地址&您想先匹配的域名,然后find_all正则表达式匹配。

您可以使用find仅检索第一个匹配的“规则”。

email = '[email protected]' 

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 = '[email protected]' 

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 = '[email protected]' 
regexp = /[A-Z0-9._%+-][email protected](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 "[email protected]" 1:"bob" 2:"luv.southwest.com">il 
+0

那么email.downcase.split呢? ...... – AnApprentice 2011-05-01 22:33:52

+0

同样的事情,这就是我喜欢Ruby的原因。如果你愿意的话,这也可以是一行代码。 – RyanScottLewis 2011-05-01 22:35:23

+1

为什么不使用'detect'而不是'find_all'? – 2011-05-01 22:36:26

您可以使电子邮件地址小写。

使用选项 “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/

+0

谢谢,但这正是我想要避免的。 – AnApprentice 2011-05-01 22:37:32

+0

你为什么要避免这种情况? – Ollie 2011-05-01 22:42:10

+0

为什么不为所有人使用一个规则? '/ \ bcraigslist.org \ b | \ bbevite.com \ b | \ bziprealty.com \ b/i' http://rubular.com/r/aF5Dhv4CFa – Ollie 2011-05-01 22:44:55

我在当前实现中看到的一个问题是,它会匹配luvesouthwestlcom.com这样的域,因为.与任何字符匹配。您可以通过逃避所有的URL处理这个您使用的是做这样的事情:

email = '[email protected]' 

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 = '[email protected]' 

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 } 
+0

哈哈,非常接近我的,但更正确。 +1 – Thilo 2011-05-01 22:53:49

你可以通过规则简单的字符串,并随时构建正则表达式:

email = '[email protected]' 

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) } 

无需使用正则表达式进行简单的字符串比较。

email = '[email protected]' 

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确实不区分大小写的比较。