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

У меня есть переменная с многострочным текстом в формате Markdown. Мне нужно преобразовать его в формат, совместимый с Telegram.

Хочу изменить заголовки (строки, начинающиеся с ‘#’) на жирный подчеркнутый текст. Пытаюсь использовать функцию replace(All), но что-то не получается.

Вот мой код:

let text = '### Анализ контекста\n\nЗдесь идет анализ...\n\nИ продолжается тут.\n\n### Еще один заголовок\n\n';
text = text.replace(/#*(.*)\n\n/g, '__*$1*__\n\n');
console.log(text);

Нужно убрать ‘#’ в начале строк и обернуть их в ‘’ и '’.

Сейчас выражение захватывает все строки. Где ошибка? Как это исправить?

Проблема в том, что регулярка захватывает больше, чем следует.

Попробуйте так:

text = text.replace(/^#+\s*(.*?)$/gm, '__*$1*__');

Флаг m включает многострочный режим. А вы часто работаете с Markdown?

а я вот таким способом делаю:

text = text.replace(/^(#{1,6})\s*(.+)$/gm, (_, hashes, title) => {
return __*${title.trim()}*__;
});

это позволяет обрабатывать заголовки любого уровня, от # до ######. еще добавил trim() чтобы убрать лишнии пробелы.

кстати, если нужно сохранить переносы строк после заголовков, можно добавить \n\n в конце замены. главное не забыть про это, а то потом будешь ломать голову почему текст слипся

Вот что можно сделать:

text = text.replace(/^#+\s*(.+)$/gm, ‘$1’);

Тут ^ привязка к началу строки, + гарантирует непустой заголовок, $ конец строки. Флаг m обрабатывает каждую строку отдельно.

Еще совет - используй trim() для удаления лишних пробелов по краям заголовка. Часто помогает избежать проблем с форматированием.