Как получить захваченные группы из регулярного выражения в JavaScript?

Проблема с извлечением групп из регулярки

Пытаюсь извлечь часть строки, используя регулярное выражение с группами в скобках, но получаю странные результаты:

var textData = "hello pattern_xyz"; // нужно получить "xyz"

var result = /(?:^|\s)pattern_(.*?)(?:\s|$)/.exec(textData);

console.log(result); // Выводит: [" pattern_xyz", "xyz"] - пока все ок
console.log(result[1]); // Выводит: undefined - почему???
console.log(result[0]); // Выводит: pattern_undefined - что за чертовщина!

В чем может быть проблема? Регулярное выражение вроде бы правильное, массив с результатами создается, но доступ к элементам работает неправильно.

Обновление: Оказалось, проблема была в том, что я тестировал на строке "date pattern_%B", а console.log интерпретирует %B как параметр форматирования и ищет следующий аргумент для подстановки.

Блин, знакомая история! То же самое было, когда дебажил парсер дат. Попробуй добавить пустую строку: console.log(result[1] + '') - тогда % не будут восприниматься как форматтеры. Или через template literals: console.log(Группа: ${result[1]}). И зачем такие сложные lookahead/lookbehind в регулярке?

Та же фигня была у меня месяц назад! Потратил целый вечер на отладку регулярки, а проблема оказалась в console.log. Когда в строке есть %B, %d или %s, консоль думает что это спецификаторы формата. Теперь использую console.dir(result) для объектов или оборачиваю в JSON.stringify() - безопаснее и без сюрпризов с выводом.

Ха, классическая ловушка с console.log! Сам попадался когда парсил логи регулярками. Твоя регулярка работает нормально - просто console.log видит %B, %s, %d и думает, что это форматтеры. Попробуй console.log(JSON.stringify(result)) или alert(result[0]) - увидишь, что группы извлекаются правильно. Или выводи через console.log(‘Результат:’, result[0]) - тогда % не будут интерпретироваться как параметры.

Да, консоль глючит с форматированием. У меня то же самое было с URL параметрами - %20 и прочие энкодинги ломали всё. Теперь всегда юзаю console.table(result) для regex массивов - показывает каждый элемент с индексом, супер удобно для групп. Или просто debugger и смотри в Variables.