Извлечение строки между скобками в Javascript: регулярные выражения
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для извлечения текста, заключенного в скобки, в JavaScript можно использовать регулярное выражение /\(([^)]+)\)/
:
const result = "Пример (текст для извлечения)".match(/\(([^)]+)\)/)?.[1] || null;
console.log(result); // "текст для извлечения"
Выражение [^)]+
обозначет любую последовательность символов, не включающую закрывающую скобку. Оператор ?.[1]
гарантирует отсутствие ошибки и возвращает null
в случае, если совпадений не найдено.
Разбор выражения
Разберем, что означает каждый элемент регулярного выражения /\(([^)]+)\)/
:
\( и \)
: Это литералы, означающие открывающую и закрывающую круглые скобки. В регулярных выражениях символы(
и)
имеют специальное значение.([^)]+)
: Это группа захвата, которая включает в себя один или более символов, кроме закрывающей скобки.
Работа с особыми случаями
Обработка нескольких групп
Если требуется найти несколько совпадений, используйте глобальный флаг g
:
const matches = [..."Пример (первый) Пример (второй)".matchAll(/\(([^)]+)\)/g)];
matches.forEach(match => console.log(match[1]));
// Вывод в консоль:
// "первый"
// "второй"
Работа с вложенными скобками
Для работы с вложенными скобками базовое регулярное выражение не подойдет, поскольку в JavaScript нельзя задавать рекурсивные шаблоны. В этом случае можно пройтись по строке с помощью итерации или использовать специальные парсеры.
Альтернатива: работа со строками
Функция split
может служить хорошей альтернативой регулярным выражениям для простых операций:
const str = "Пример (текст для извлечения)";
const beforeBrace = str.split('(')[1] || ""; // разделяем строку до первой открывающей скобки
const result = beforeBrace.split(')')[0] || null; // разделяем строку до следующей закрывающей скобки
console.log(result); // "текст для извлечения"
Однако стоит помнить, что регулярные выражения обеспечат большую гибкость при работе со сложными текстами.
Визуализация
Рассмотрим это на примере строки:
Строка: "Созерцая звезды (удивление и восхищение) в ночном небе."
Применим к ней наше регулярное выражение:
Match = str.match(/\(([^)]+)\)/);
И вот результат. Регулярное выражение успешно извлекает необходимый текст:
🔍 Сканировано: "Созерцая звезды (удивление и восхищение) в ночном небе."
🏊 Найдено: "удивление и восхищение"
Видно, какую мощь предоставляет нам регулярное выражение!
Полезные советы и хитрости
Сочетание глобального поиска и метода matchAll
Для извлечения всех вхождений текста, заключенного в скобки, используйте флаг g
вместе с методом matchAll
:
const regex = /\(([^)]+)\)/g;
const string = "Многие (жемчужины) скрыты в (глубинах) океана.";
const matchesIterator = string.matchAll(regex);
for (const match of matchesIterator) {
console.log(match[1]);
}
Обработка случаев, когда совпадений не найдено
Всегда учтите возможность того, что совпадений не будет, чтобы избежать ошибок в выполнении кода:
const match = "Здесь нет скобок".match(/\(([^)]+)\)/);
const result = match ? match[1] : null;
Роль групп захвата
Группа захвата №1 (([^)]+)
) отвечает за извлечение интересующего нас текста. Цель достигнута. 🎯
Тестирование регулярных выражений
Для тестирования и анализа регулярных выражений можно использовать различные онлайн-редакторы, например regex101.
Полезные материалы
- Регулярные выражения в JavaScript | MDN – подробное руководство по использованию регулярных выражений в JavaScript.
- RegExp.prototype.exec() – JavaScript | MDN – подробное объяснение работы метода
exec()
. - JavaScript RegExp Reference — справочник с примерами по RegExp.
- regex101: создание, тестирование, отладка регулярных выражений — онлайн-инструмент для тестирования регулярных выражений.
- [Regular Expressions Cookbook, 2nd Edition [Book]](https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/) — ресурс для основательного изучения регулярных выражений.
- Regular Expression Tutorial — учебник по регулярным выражениям для начинающих.
- Patterns and flags – вводный материал по паттернам и флагам регулярных выражений в JavaScript.