【发布时间】:2011-07-29 04:19:45
【问题描述】:
假设我有一个字符串str = "Things to do: eat and sleep."
如何检查 "do: " 是否存在于 str 中,不区分大小写?
【问题讨论】:
标签: ruby regex string substring
假设我有一个字符串str = "Things to do: eat and sleep."
如何检查 "do: " 是否存在于 str 中,不区分大小写?
【问题讨论】:
标签: ruby regex string substring
像这样:
puts "yes" if str =~ /do:/i
要返回一个布尔值(可能来自方法),请将匹配结果与nil 进行比较:
def has_do(str)
(str =~ /do:/i) != nil
end
或者,如果您不喜欢!= nil,那么您可以使用!~ 而不是=~ 并否定结果:
def has_do(str)
not str !~ /do:/i
end
但我不太喜欢双重否定……
【讨论】:
!! 技巧只得到一个布尔结果:>> !!(str =~ /do:/i) #=> true 和 >> !!(str =~ /da:/i) #=> false。
在 ruby 1.9 中,您可以这样做:
str.downcase.match("do: ") do
puts "yes"
end
这不完全是您所要求的,但我注意到对另一个答案的评论。如果您在匹配字符串时不介意使用正则表达式,也许有一种方法可以跳过小写部分以不区分大小写。
欲了解更多信息,请参阅String#match
【讨论】:
str.match(/do: /i)
如果我正在寻找的只是我通常使用的不区分大小写的子字符串匹配:
str.downcase['do: ']
10 次中有 9 次我不在乎匹配在字符串中的哪个位置,所以这很好而且简洁。
这是 IRB 中的样子:
>> str = "Things to do: eat and sleep." #=> "Things to do: eat and sleep."
>> str.downcase['do: '] #=> "do: "
>> str.downcase['foobar'] #=> nil
因为如果没有命中它会返回nil,它也适用于条件句。
【讨论】:
"Things to do: eat and sleep.".index(/do: /i)
index 返回匹配开始的位置,如果没有找到则返回 nil
您可以在此处了解有关索引方法的更多信息: http://ruby-doc.org/core/classes/String.html
或者关于这里的正则表达式: http://www.regular-expressions.info/ruby.html
【讨论】:
你也可以这样做:
str.downcase.include? "Some string".downcase
【讨论】: