У меня есть строковая переменная с содержимым:
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"
Как я могу найти это? Мне нужно определить, присутствует ли подстрока или нет.
Ответы:
Вы можете использовать
include?
метод:источник
include?
это чувствительный случай. Так что еслиmy_string
в приведенном выше примере будет что-то вроде"abcDefg"
(с заглавной буквыD
),include?("cde")
вернетсяfalse
. Вы можете сделатьdowncase()
перед звонкомinclude?()
.to_s
скрывает проблему и увеличивает расстояние между источником и обнаружением проблемы, затрудняя отладку.Если регистр не имеет значения, то регулярное выражение без учета регистра является хорошим решением:
Это также будет работать для многострочных строк.
Смотрите Ruby's Regexp class для получения дополнительной информации.
источник
Regexp.escape
строку. Для большинства случаев использованияsome_str.include? substr.downcase()
должно работать быстрее и быть более читабельным.'aBcDe'.downcase.include?('bcd')
. У Regex есть свои цели, но не используйте их, когда встроенные методы работают быстрее. Сравнение с тестируемыми фактическими данными может многое показать./bcd/i.match?('aBcDe')
Вы также можете сделать это ...
В этом примере используется
#[]
метод String Ruby .источник
#include?
все еще немного быстрее.#include?
не работает, когда вы работаете с предложениями с пробелами внутри, потому что#include
разделяет предложение на слова, а затем использует слова как отдельные значения массива. Это отлично работает для предложений. +1[]
Метод String в Ruby для получения дополнительной информации.Расширяя ответ Клинта Пахля:
Соответствие регулярному
nil
выражению в Ruby возвращается, когда выражение не совпадает. Когда это происходит, он возвращает индекс символа, где происходит совпадение. Например:Важно отметить, что только в Ruby
nil
и логическом выраженииfalse
оценивается как ложное. Все остальное, включая пустой массив, пустой хэш или целое число 0, оценивается как true.Вот почему
/foo/
приведенный выше пример работает и почему.работает как положено, вводя «истинную» часть
if
блока только в случае совпадения.источник
Более краткая идиома, чем принятый выше ответ, который доступен в Rails (от 3.1.0 и выше)
.in?
:Я также думаю, что это более читабельно.
Смотрите
in?
документацию для получения дополнительной информации.Обратите внимание, что он доступен только в Rails , а не на чистом Ruby.
источник
in?
."cde".in? my_string
в чистом рубиновом урожаеNoMethodError
. Но сrequire 'active_support/core_ext/object/inclusion'
этим работает, который может быть загружен либо из самого Rails , либо из урезанных расширений Active Support Core .Троичный путь
ИЛИ
источник
Вы можете использовать метод String Element Reference, который
[]
Внутри
[]
может быть литеральная подстрока, индекс или регулярное выражение:Поскольку
nil
функционально такой же, какfalse
и любая подстрока, возвращаемая из[]
,true
вы можете использовать логику, как если бы вы использовали метод.include?
:Просто убедитесь, что вы не путаете индекс с подстрокой:
Вы также можете использовать регулярное выражение:
источник
Когда вы говорите «чек», я предполагаю, что вы хотите вернуть логическое значение, и в этом случае вы можете использовать
String#match?
.match?
принимает строки или регулярные выражения в качестве первого параметра, если он первый, то он автоматически преобразуется в регулярное выражение. Таким образом, ваш вариант использования будет:String#match?
имеет дополнительное преимущество необязательного второго аргумента, который указывает индекс для поиска строки. По умолчанию это установлено на0
.источник
Это поможет вам проверить, содержит ли строка подстроку или нет
источник