Методы поиска по строке

Методы поиска по строке

Технический фундамент поиска по строке

Методы поиска по строке можно разделить по типу результата:

  • булевы проверки (includes, startsWith, endsWith);
  • позиция совпадения (indexOf, search);
  • сами совпадения (match).
const text = 'JavaScript';

console.log(text.includes('Script')); // true
console.log(text.indexOf('Script')); // 4
console.log(text.match(/Script/)); // ['Script', ...]

Ключевая идея урока: разные методы отвечают на разные вопросы, поэтому важно заранее понимать, какой тип ответа тебе нужен.

Быстрые проверки: includes, startsWith, endsWith

includes(substring) проверяет, есть ли подстрока.

const title = 'JavaScript для начинающих';

console.log(title.includes('Script')); // true
console.log(title.includes('Python')); // false

startsWith проверяет начало строки, endsWith — конец.

const file = 'avatar.png';

console.log(file.startsWith('ava')); // true
console.log(file.endsWith('.png')); // true
console.log(file.endsWith('.jpg')); // false

Смотри, что важно: все эти методы возвращают true или false, поэтому их удобно ставить прямо в if.

Проверь себя: что вернет 'Hello'.includes('')?

Подсказка: true. Пустая строка считается «найденной» в любой строке. Это полезно помнить, если query может быть пустым.

Позиционный поиск: indexOf

Если нужна не просто проверка, а позиция в строке, используют indexOf.

const message = 'Order #A-120 created';

const hashIndex = message.indexOf('#');
console.log(hashIndex); // 6

Если значение -1, совпадение не найдено.

if (message.indexOf('ERROR') !== -1) {
  console.log('Найдено сообщение об ошибке');
}

Поиск с регулярным выражением: search и match

Новый термин: регулярное выражение (RegExp) — шаблон поиска в тексте.

search возвращает индекс первого совпадения или -1.

const sku = 'product-2026-sale';
console.log(sku.search(/\d+/)); // 8

match возвращает найденные совпадения.

const text = 'Цена: 1200, скидка: 15%';

console.log(text.match(/\d+/)); // ['1200', ...]
console.log(text.match(/\d+/g)); // ['1200', '15']

Здесь часто путаются: без флага g ты получаешь только первое совпадение.

Что будет, если поменять вход

const email = 'User@Example.com';

console.log(email.includes('@example.com')); // false
console.log(email.toLowerCase().includes('@example.com')); // true

Поиск чувствителен к регистру. Для поиска по пользовательскому вводу обычно делают нормализацию через toLowerCase().

Микро-сценарии

  1. Поиск в списке курсов.
function matchesQuery(title, query) {
  return title.toLowerCase().includes(query.trim().toLowerCase());
}

Смотри, что важно: если query после trim() станет пустой строкой, includes('') вернет true, и тогда совпадут все элементы. Это нормально для UX «пустой поиск показывает все», но решение должно быть осознанным.

  1. Простая проверка формата email на клиенте.
function looksLikeEmail(value) {
  return value.includes('@') && value.includes('.');
}

Это не полноценная RFC-валидация, но как быстрый UI-фильтр подходит.

Типичные ошибки

  • Считать, что поиск «игнорирует регистр» сам по себе.
  • Писать if (str.indexOf('x')) и ломать кейс, когда индекс 0.
  • Использовать match без понимания флага g.
  • Применять слишком сложный RegExp, когда хватает includes.

Анти-провал: если нужна булева проверка, бери includes/startsWith/endsWith; если нужен индекс, бери indexOf/search.

Краткий итог

  • includes, startsWith, endsWith дают простые булевы проверки.
  • indexOf и search полезны, когда важна позиция.
  • match подходит для получения самих совпадений.
  • Поиск чувствителен к регистру, часто нужна нормализация.
  • Всегда учитывай кейс «не найдено» (-1 или null).