Как проверить, содержит ли строка подстроку в Ruby?

У меня есть строковая переменная с контентом следующим образом:

varMessage =   
            "hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n"


            "/my/name/is/balaji.so\n"
            "call::myFunction(int const&)\n"
            "void::secondFunction(char const&)\n"
             .
             .
             .
            "this/is/last/line/liobrary.so"

в приведенной выше строке я должен найти подстроку i.e.

"hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n"


"/my/name/is/balaji.so\n"
"call::myFunction(int const&)\n"

Как я могу его найти? Мне просто нужно определить, присутствует ли подстрока или нет.

Ответ 1

Вы можете использовать метод include?:

my_string = "abcdefg"
if my_string.include? "cde"
   puts "String includes 'cde'"
end

Ответ 2

Если случай не имеет значения, то нечувствительное к регистру регулярное выражение является хорошим решением:

'aBcDe' =~ /bcd/i  # evaluates as true

Это также будет работать для многострочных строк.

См. раздел Ruby Regexp.

Ответ 3

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

my_string = "Hello world"

if my_string["Hello"]
  puts 'It has "Hello"'
else
  puts 'No "Hello" found'
end

# => 'It has "Hello"'

Ответ 4

Развернувшись на ответе Клинта Пачля:

Согласование регулярных выражений в Ruby возвращает nil, когда выражение не совпадает. Когда это произойдет, он возвращает индекс символа, в котором происходит совпадение. Например

"foobar" =~ /bar/  # returns 3
"foobar" =~ /foo/  # returns 0
"foobar" =~ /zzz/  # returns nil

Важно отметить, что в Ruby только nil и логическое выражение false вычисляются как false. Все остальное, включая пустой массив, пустой хэш или целое число 0, имеет значение true.

Вот почему работает /foo/example выше и почему

if "string" =~ /regex/

работает как ожидалось. Только ввод "истинной" части блока if, если произошло совпадение.

Ответ 5

Тернативный путь

my_string.include?('ahr') ? (puts 'String includes ahr') : (puts 'String does not include ahr')

ИЛИ

puts (my_string.include?('ahr') ? 'String includes ahr' : 'String not includes ahr')

Ответ 6

Более сжатая идиома, чем принятый ответ выше, доступный в Rails (от 3.1.0 и выше), .in?.

например:

my_string = "abcdefg"
if "cde".in? my_string
  puts "'cde' is in the String."
  puts "i.e. String includes 'cde'"
end

Я также считаю его более читаемым.

c.f. http://apidock.com/rails/v3.1.0/Object/in%3F

(Обратите внимание, что он доступен только в Rails, а не в чистом Ruby.)

Ответ 7

user_input = gets.chomp
user_input.downcase!

if user_input.include?('substring')
  # Do something
end

Это поможет вам проверить, содержит ли строка подстроку или нет.

puts "Enter a string"
user_input = gets.chomp  # Ex: Tommy
user_input.downcase!    #  tommy


if user_input.include?('s')
    puts "Found"
else
    puts "Not found"
end

Ответ 8

Вы можете использовать String Element Reference, который []

Внутри [] может быть буквальная подстрока, индекс или регулярное выражение:

> s='abcdefg'
=> "abcdefg"
> s['a']
=> "a"
> s['z']
=> nil

Так как nil функционально совпадает с false, и любая подстрока, возвращаемая из [], равна true, вы можете использовать логику, как если бы вы использовали метод .include?:

0> if s[sub_s]
1>    puts "\"#{s}\" has \"#{sub_s}\""
1> else 
1*    puts "\"#{s}\" does not have \"#{sub_s}\""
1> end
"abcdefg" has "abc"

0> if s[sub_s]
1>    puts "\"#{s}\" has \"#{sub_s}\""
1> else 
1*    puts "\"#{s}\" does not have \"#{sub_s}\""
1> end
"abcdefg" does not have "xyz" 

Просто убедитесь, что вы не путаете индекс с подстрокой:

> '123456790'[8]    # integer is eighth element, or '0'
=> "0"              # would test as 'true' in Ruby
> '123456790'['8']  
=> nil              # correct

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

> s[/A/i]
=> "a"
> s[/A/]
=> nil