Avatar ·

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

Всем привет! Я только начал изучать JavaScript и столкнулся с такой задачей: нужно проверить, есть ли в строке определённое слово или набор символов. Например, у меня есть переменная с email пользователя: ```javascript let email = "ivan.petrov@gmail.com"; ``` И мне нужно понять, содержит ли этот email символ "@". Я пробовал использовать оператор `==` и `===`, но они сравнивают строки целиком, а не проверяют вхождение. Также я слышал про метод `indexOf`, но не совсем понял, как его правильно применять. Подскажите, пожалуйста, какие есть способы в JavaScript для проверки наличия подстроки в строке? Желательно с примерами кода и объяснением, какой способ лучше использовать в современных проектах. Заранее спасибо! <<>>

Самый современный способ: метод includes()

Начиная с ECMAScript 2015 (ES6) в JavaScript появился метод String.prototype.includes(). Это самый простой и читаемый способ проверить, содержит ли строка подстроку. Метод возвращает true или false.

let email = "ivan.petrov@gmail.com";
let hasAtSymbol = email.includes("@");
console.log(hasAtSymbol); // true

let message = "Hello, world!";
console.log(message.includes("world")); // true
console.log(message.includes("World")); // false (регистрозависимо)
console.log(message.includes("foo"));   // false

Важно: метод includes() чувствителен к регистру. Если вам нужно игнорировать регистр, приведите обе строки к одному регистру:

let text = "JavaScript is awesome";
let search = "javascript";
console.log(text.toLowerCase().includes(search.toLowerCase())); // true

Классический способ: метод indexOf()

До появления includes() чаще всего использовали indexOf(). Этот метод возвращает индекс первого вхождения подстроки или -1, если подстрока не найдена.

let str = "Hello, world!";
let index = str.indexOf("world");
console.log(index); // 7 (индекс первого символа подстроки)

if (str.indexOf("world") !== -1) {
    console.log("Подстрока найдена!");
} else {
    console.log("Подстрока не найдена.");
}

Метод indexOf() также может принимать второй параметр — позицию, с которой начинать поиск:

let text = "apple, banana, apple";
console.log(text.indexOf("apple", 1)); // 15 (второе вхождение)

Другие методы

  • search() — работает как indexOf(), но принимает регулярное выражение:
let text = "Hello123";
console.log(text.search(/\d+/)); // 5 (индекс начала цифр)
  • match() — возвращает массив совпадений или null:
let text = "The rain in Spain";
console.log(text.match(/ain/)); // ["ain", index: 5, ...]

Рекомендации

Для простой проверки наличия подстроки (без учёта позиции) всегда используйте includes() — он более читаемый и понятный. indexOf() стоит применять, если вам нужна позиция вхождения. search() и match() — для работы с регулярными выражениями.

Совместимость: includes() поддерживается всеми современными браузерами и Node.js. Для поддержки IE используйте indexOf().

<<>>

Проверка с использованием регулярных выражений

Если вам нужно более гибкое сравнение (например, с игнорированием регистра или поиск по шаблону), используйте метод test() объекта RegExp:

let text = "JavaScript is fun";
let regex = /javascript/i; // флаг i - игнорирование регистра
console.log(regex.test(text)); // true

// Поиск цифр в строке
let text2 = "User123";
console.log(/\d/.test(text2)); // true

Также можно использовать метод match() для получения детальной информации о совпадении:

let text = "Hello 123 World";
let result = text.match(/\d+/);
if (result) {
    console.log("Найдено число:", result[0]); // "123"
}

Регулярные выражения особенно полезны, когда нужно проверить сложные шаблоны: email, телефон, URL и т.д. Однако для простой проверки "содержит ли строка другую строку" они избыточны — лучше использовать includes().