Как получить доступ к совпадающим группам в регулярных выражениях JavaScript?

Я пытаюсь использовать регулярное выражение для поиска части строки, но у меня возникли проблемы с доступом к найденным подстрокам. Вот мой код:

let текст = 'что-то формат_123';
let результат = /(?:^|\s)формат_(.*?)(?:\s|$)/.exec(текст);

console.log(результат);
console.log(результат[1]);
console.log(результат[0]);

Я ожидаю получить ‘123’, но почему-то выводится ‘undefined’. Что я делаю не так? Как правильно получить доступ к найденным группам в регулярном выражении?

Буду благодарен за помощь в решении этой проблемы!

привет! я тоже сталкивался с похожей проблемой когда только начинал работать с регулярками. в твоем случае все дело в том, что ты используешь метод exec() вместо match(). попробуй заменить эту строку:

let результат = текст.match(/(?:^|\s)формат_(.*?)(?:\s|$)/);

и тогда все должно заработать как надо. результат[1] вернет тебе ‘123’. кстати, еще можно использовать String.prototype.matchAll() - он вернет итератор со всеми совпадениями, если их несколько. удачи в освоении регулярок!

Твоя регулярка в целом правильная, но есть нюанс с пробелами. В строке ‘что-то формат_123’ нет пробела перед ‘формат’, поэтому совпадения нет. Попробуй упростить:

let результат = /формат_(\d+)/.exec(текст);
console.log(результат[1]); // выведет ‘123’

Так будет работать. Если нужно учесть пробелы, можно добавить \s* перед ‘формат’ в регулярке. exec() вполне подходит, главное убедиться, что совпадение есть.

Ребят, а вы не думали использовать деструктуризацию? Она сильно упрощает работу с группами. Типа так:

let [, число] = текст.match(/формат_(\d+)/) || ;
console.log(число); // ‘123’

Прикольно же? И код читается легче. А еще можно добавить оператор ‘??’ чтобы избежать ошибок, если совпадений нет. Кто-нибудь так делал?