Как проверить, содержит ли строка подстроку в JavaScript? (методы includes, indexOf, search)
Самый простой и современный способ: метод includes()
Начиная с ECMAScript 2015 (ES6), в JavaScript появился метод String.prototype.includes(), который идеально подходит для вашей задачи. Он возвращает true, если строка содержит указанную подстроку, и false в противном случае. Метод чувствителен к регистру.
let text = "Привет, мир! Сегодня отличная погода.";
let searchWord = "мир";
if (text.includes(searchWord)) {
console.log("Строка содержит слово");
} else {
console.log("Строка не содержит слово");
}
// Вывод: "Строка содержит слово"
Метод includes() также принимает второй необязательный параметр — позицию, с которой начинать поиск:
let text = "Привет, мир! Мир прекрасен.";
console.log(text.includes("мир", 10)); // false — начиная с 10-й позиции "мир" не найден
console.log(text.includes("мир", 0)); // true — поиск с начала строки
Классический способ: метод indexOf()
Этот метод существует с первых версий JavaScript. Он возвращает индекс первого вхождения подстроки или -1, если подстрока не найдена. Для проверки наличия подстроки используйте сравнение с -1:
let text = "Привет, мир! Сегодня отличная погода.";
let searchWord = "мир";
if (text.indexOf(searchWord) !== -1) {
console.log("Строка содержит слово");
} else {
console.log("Строка не содержит слово");
}
// Вывод: "Строка содержит слово"
indexOf() тоже принимает второй параметр — начальную позицию поиска. Этот метод полезен, когда вам нужно не просто проверить наличие, но и узнать точную позицию подстроки.
Регулярные выражения: метод search() и test()
Если вам нужна более гибкая проверка (например, без учёта регистра или с использованием шаблонов), используйте регулярные выражения:
let text = "Привет, мир! Сегодня отличная погода.";
let searchWord = "мир";
// Метод search() возвращает индекс или -1
if (text.search(/мир/) !== -1) {
console.log("Найдено");
}
// Метод test() возвращает true/false
if (/мир/.test(text)) {
console.log("Найдено");
}
// Поиск без учёта регистра (флаг i)
if (/МИР/i.test(text)) {
console.log("Найдено без учёта регистра");
}
Важные моменты и рекомендации
- Чувствительность к регистру: Все три метода (
includes,indexOf,search) чувствительны к регистру. Для поиска без учёта регистра используйте регулярные выражения с флагомiили предварительно приводите обе строки к одному регистру:text.toLowerCase().includes(searchWord.toLowerCase()). - Работа с кириллицей: Все методы корректно работают с кириллицей и другими Unicode-символами. Никаких дополнительных настроек не требуется.
- Производительность: Для простых проверок
includes()— самый читаемый и быстрый вариант.indexOf()часто используется в старом коде. Регулярные выражения немного медленнее, но предоставляют больше возможностей. - Совместимость:
includes()поддерживается во всех современных браузерах и средах (Node.js 6+). Если вам нужно поддерживать очень старые браузеры (например, Internet Explorer), используйтеindexOf().
Для вашей задачи рекомендую использовать includes() — это самый простой и наглядный способ. Если же вам нужно узнать позицию подстроки или вы работаете с устаревшим кодом, используйте indexOf().
Альтернативный подход: метод match() и оператор in
Помимо основных методов, существуют и другие способы проверки наличия подстроки, которые могут быть полезны в специфических ситуациях.
Метод match() с регулярным выражением
Этот метод возвращает массив совпадений или null, если ничего не найдено. Можно использовать для проверки:
let text = "Привет, мир! Сегодня отличная погода.";
let result = text.match(/мир/);
if (result) {
console.log("Слово найдено: " + result[0]); // Вывод: "Слово найдено: мир"
} else {
console.log("Не найдено");
}
Метод match() особенно удобен, когда нужно получить все вхождения подстроки или извлечь часть строки по шаблону.
Использование оператора in (не подходит для строк!)
Важно: оператор in работает только с объектами и массивами, но не со строками. Начинающие разработчики иногда пытаются сделать так:
let text = "Привет, мир!";
if ("мир" in text) { // Ошибка! Неправильное использование
console.log("Найдено");
}
Этот код не будет работать корректно, так как in проверяет наличие ключа/свойства в объекте, а не подстроки. Для строк используйте только методы, описанные выше.
Совет по написанию универсальной функции
Если вы часто проверяете наличие подстрок, создайте небольшую утилиту:
function containsSubstring(str, substr, caseSensitive = true) {
if (!caseSensitive) {
return str.toLowerCase().includes(substr.toLowerCase());
}
return str.includes(substr);
}
console.log(containsSubstring("Привет, Мир!", "мир", false)); // true
console.log(containsSubstring("Привет, Мир!", "мир", true)); // false
Выбирайте метод в зависимости от задачи: для простой проверки — includes(), для позиции — indexOf(), для гибкого поиска — регулярные выражения.
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги