Как проверить, содержит ли строка подстроку в Ruby? - PullRequest
669 голосов
/ 24 ноября 2011

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

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"

в приведенной выше строке мне нужно найти подстроку, т.е.

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


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

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

Ответы [ 9 ]

1249 голосов
/ 24 ноября 2011

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

my_string = "abcdefg"
if my_string.include? "cde"
   puts "String includes 'cde'"
end
78 голосов
/ 01 июля 2014

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

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

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

См. Ruby's Regexp класс.

40 голосов
/ 31 июля 2014

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

my_string = "Hello world"

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

# => 'It has "Hello"'
30 голосов
/ 09 июля 2015

Расширение ответа Клинта Пахла:

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

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

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

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

if "string" =~ /regex/

работает так, как ожидается,Ввод «истинной» части блока if только в случае совпадения.

19 голосов
/ 08 апреля 2015

Более краткая идиома, чем принятый выше ответ, который доступен в 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

Мне также кажется, что он более читабелен.

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

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

16 голосов
/ 26 января 2015

Тройной путь

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')
9 голосов
/ 05 июля 2017

Вы можете использовать метод Ссылка на элемент строки , который []

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

> 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
2 голосов
/ 01 апреля 2016
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
1 голос
/ 05 апреля 2018

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

Когда вы говорите «чек», я предполагаю, что вы хотите вернуть логическое значение, в этом случае вы можете использовать String#match? match? принимает строки или регулярные выражения в качестве первого параметра, если он первый, то он автоматически преобразуется в регулярное выражение. Таким образом, ваш вариант использования будет:

str = 'string'
str.match? 'strings' #=> false
str.match? 'string'  #=> true
str.match? 'strin'   #=> true
str.match? 'trin'    #=> true
str.match? 'tri'     #=> true

String#match? имеет дополнительное преимущество необязательного второго аргумента, который указывает индекс для поиска строки. По умолчанию установлено значение 0.

str.match? 'tri',0   #=> true
str.match? 'tri',1   #=> true
str.match? 'tri',2   #=> false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...