Как сделать поиск подстроки в JavaScript нечувствительным к регистру
Быстрый ответ
Для осуществления поиска текста в строке без учета регистра вы можете использовать методы .toLowerCase()
или .toUpperCase()
в сочетании с .includes()
:
let содержит = "JavaScript".toLowerCase().includes("script".toLowerCase());
// вернёт true
Благодаря приведению сравниваемых строк к общему регистру, данный подход становится универсальным и позволяет .includes()
опустить различия в написании букв.
Различные методы поиска
Надёжный RegExp в JavaScript
Для обеспечения более гибкого поиска можно применять регулярные выражения с флагом i
, который снимает учет регистра:
let pattern = /script/i;
let содержитRegEx = pattern.test("JavaScript");
// вернёт true
Универсальная функция indexOfInsensitive
Чтобы избежать повторов, можно создать функцию для регистронезависимого поиска:
function indexOfInsensitive(где_искать, что_искать) {
return где_искать.toLowerCase().indexOf(что_искать.toLowerCase()) !== -1;
}
Метод includes для быстрого поиска
Метод .includes()
более предпочтителен, чем .indexOf()
, для проверки наличия подстроки, так как он возвращает логическое значение и проще в использовании:
let содержитIncludes = "JavaScript".includes("script");
// вернёт true
Производительность методов
Регулярные выражения могут быть обременительными в случае работы с большими текстами или при выполнении множество поисковых запросов. В таких ситуациях более эффективно использовать методы строки.
Визуализация
Представьте, что вы ищете книги в библиотеке с названиями, написанными в различной форме и регистре, при этом игнорируя регистр:
📚🔍 Поиск: 'javascript'
Вот как функционирует регистронезависимый поиск:
const названияКниг = ['JavaScript', 'JAVASCRIPT', 'javascript', 'Java'];
const искомоеСлово = 'javascript';
const соответствущиеНазвания = названияКниг.filter(название =>
название.toUpperCase() === искомоеСлово.toUpperCase());
Результат:
Найденные совпадения: ['JavaScript', 'JAVASCRIPT', 'javascript']
RegExp: поиск с полным набором удобств
Переиспользование шаблонов с RegExp
Создайте фабрику для RegExp, чтобы переиспользовать одни и те же паттерны:
function createCaseInsensitiveRegexp(str) {
return new RegExp(str, 'i');
}
const pattern = createCaseInsensitiveRegexp('script');
Удобный метод test()
Метод test()
предоставляет быстрый ответ в формате "да" или "нет":
let этоMatch = createCaseInsensitiveRegexp('script').test("JavaScript");
// вернёт true
Осторожно с расширением прототипов
Расширение встроенных прототипов приносит удобство, но важно быть бдительными, чтобы избежать конфликтов:
String.prototype.includesCaseInsensitive = function(искомаяСтрока) {
return this.toLowerCase().includes(искомаяСтрока.toLowerCase());
};
Совершенствуйте код с помощью новых возможностей
Работаем со спецсимволами в Regex
С помощью Regex можно эффективно искать спецсимволы:
let содержитСпецСимволы = /[@#]/i.test('Привет#Мир');
// вернёт true
Равное внимание к регистру
Преобразование всех строк к одному регистру облегчит их сравнение:
let одинаковыйРегистр = 'JavaScript'.toLowerCase() === 'JAVAscript'.toLowerCase();
// вернёт true
Код в порядке и чистоте
Рефакторинг общих задач в методы или функции сделает ваш код более аккуратным и понятным.
Полезные материалы
- String.prototype.includes() – JavaScript | MDN – документация метода
String.includes()
. - String.prototype.toLowerCase() – JavaScript | MDN – подробности о преобразовании строк в нижний регистр.
- String.prototype.toUpperCase() – JavaScript | MDN – особенности преобразования строк в верхний регистр.
- javascript – Как сравнивать строки, не принимая во внимание регистр? – Stack Overflow – дебаты о сравнении строк без учета регистра.
- Сравнения – обзор методов сравнения строк, в том числе с учетом регистра.
- RegExp.prototype.test() – JavaScript | MDN – описание метода
test
у класса RegExp. - Как использовать регулярные выражения в JavaScript – применение регулярных выражений для поиска без учета регистра в JavaScript.