Методы поиска по строке
Методы поиска по строке
Технический фундамент поиска по строке
Методы поиска по строке можно разделить по типу результата:
- булевы проверки (
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().
Микро-сценарии
- Поиск в списке курсов.
function matchesQuery(title, query) {
return title.toLowerCase().includes(query.trim().toLowerCase());
}
Смотри, что важно: если query после trim() станет пустой строкой, includes('') вернет true, и тогда совпадут все элементы. Это нормально для UX «пустой поиск показывает все», но решение должно быть осознанным.
- Простая проверка формата 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).