> Как отфильтровать строку, чтобы оставить только буквы с помощью регулярных выражений в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Яндекс
Стек: JavaScript
> Пример ответа
Короткий ответ
Для фильтрации строки, оставляя только буквы, используйте string.replace(/[^a-zA-Zа-яА-ЯёЁ]/g, ''). Если нужна поддержка Unicode, лучше применить string.match(/[\p{L}]/gu)?.join('') или string.replace(/[^\p{L}]/gu, '') - флаг u включает Unicode-режим, а \p{L} соответствует любой букве. Для латиницы и кириллицы достаточно первого варианта.
Подробное объяснение
Регулярное выражение [^...] - это отрицающий символьный класс: он находит любой символ, не входящий в указанный набор. Внутри мы перечисляем диапазоны букв: a-z (латиница нижний регистр), A-Z (верхний), а-я и А-Я (кириллица), плюс ёЁ отдельно, так как ё не входит в диапазон а-я в кодировке Unicode. Флаг g (global) заменяет все вхождения, а не первое.
Метод replace с таким шаблоном удаляет все не-буквы, заменяя их на пустую строку. Альтернатива - match с позитивным классом [\p{L}], который собирает только буквы в массив, затем join('') склеивает их обратно. \p{L} - это Unicode property escape для любой буквы любого алфавита, включая диакритические знаки (например, é, ñ). Флаг u обязателен для работы \p{}.
Для производительности на больших строках replace обычно быстрее, чем match + join. Если нужна только ASCII-латиница, упростите до /[^a-zA-Z]/g.
На практике
Выбор подхода зависит от требований к локализации. В интернациональных проектах используйте \p{L} - он покрывает все алфавиты (арабский, китайский, греческий и т.д.). Для русскоязычных форм достаточно кириллицы и латиницы. Учтите, что \p{L} не включает цифры и знаки препинания - это ожидаемо.
Если нужно сохранить пробелы, добавьте их в отрицающий класс: /[^a-zA-Zа-яА-ЯёЁ\s]/g. Для удаления только букв (обратная задача) уберите ^: /[a-zA-Zа-яА-ЯёЁ]/g.
Пример кода
JAVASCRIPT// Только латиница и кириллицаconst filterBasic = (str) => str.replace(/[^a-zA-Zа-яА-ЯёЁ]/g, '');// Unicode-версия (все буквы мира)const filterUnicode = (str) => str.replace(/[^\p{L}]/gu, '');// Альтернатива через matchconst filterMatch = (str) => str.match(/[\p{L}]/gu)?.join('') || '';// Примерыconsole.log(filterBasic('Hello, Мир! 123')); // "HelloМир"console.log(filterUnicode('Café résumé 2024')); // "Caférésumé"console.log(filterMatch('Привет, world!')); // "Приветworld"
Как отвечать на собеседовании
Начните с простого решения для латиницы и кириллицы, затем упомяните Unicode-подход как более универсальный. Объясните разницу между replace и match с точки зрения производительности и читаемости. Упомяните, что \p{L} требует флаг u и поддерживается в современных браузерах и Node.js. Если спросят про Edge-кейсы, скажите, что для фильтрации с сохранением пробелов или цифр нужно расширить класс.
Что проверяет интервьюер
- Понимание регулярных выражений: символьные классы, диапазоны, отрицание, флаги.
- Знание Unicode-свойств (
\p{L}) и их ограничений (требуетсяu). - Умение выбирать между
replaceиmatchв зависимости от задачи. - Осознание trade-off между простотой и универсальностью.
Типичные ошибки
- Забывают про букву
ёв кириллице - она не входит в диапазона-я. - Не указывают флаг
g, из-за чего удаляется только первый не-буквенный символ. - Используют
\w(буквы, цифры, подчёркивание) вместо явного перебора букв - это включает лишние символы. - Путают
\p{L}с\p{Letter}(это одно и то же, но\p{L}короче). - Не проверяют поддержку
\p{L}в старых средах (например, Internet Explorer).
> Похожие задачи по frontend
Как реализовать функцию retry для повторного вызова асинхронной функции при ошибке в JavaScript
Как обрабатывать дублирующиеся ключи при преобразовании массива объектов в объект в JavaScript
Куда записывается свойство при добавлении его в прототип объекта в JavaScript
Каковы причины утечек памяти в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью