Как я могу проверить, существует ли слово в строке и вернуть false, если это не так, в ruby?

Скажем, у меня есть строка str = "Things to do: eat and sleep."

Как я могу проверить, существует ли "do: " в str, нечувствительный к регистру?

Ответ 1

Вот так:

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

Но мне не нравятся двойные отрицания...

Ответ 2

В ruby ​​1.9 вы можете сделать следующее:

str.downcase.match("do: ") do   
  puts "yes" 
end

Это не совсем то, что вы просили, но я заметил комментарий к другому ответу. Если вы не возражаете использовать регулярные выражения при сопоставлении строки, возможно, есть способ пропустить нижнюю часть, чтобы получить нечувствительность к регистру.

Для получения дополнительной информации см. соответствие строки #

Ответ 3

Вы также можете сделать это:

str.downcase.include? "Some string".downcase

Ответ 4

Если все, что я ищу, это совпадение с подстрокой case = indensitive, которое я обычно использую:

str.downcase['do: ']

9 раз из 10 Мне все равно, где в строке есть совпадение, так что это красиво и лаконично.

Вот как это выглядит в IRB:

>> str = "Things to do: eat and sleep." #=> "Things to do: eat and sleep."
>> str.downcase['do: '] #=> "do: "
>> str.downcase['foobar'] #=> nil

Поскольку он возвращает nil, если нет ударов, он также работает в условных выражениях.