> Как отфильтровать строку, чтобы оставить только буквы с помощью регулярных выражений в 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, '');
// Альтернатива через match
const 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).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью