Вы можете сопоставить двойной символ LF и затем последовательность из 1 или более экземпляров двойного символа LF и заменить только те, которые следуют после первого \n\n
.
.replace(/\n\n((?:\n\n)+)/g, function (_,x) { return "\n\n" + x.replace(/\n\n/g, '<br>'); })
или, чтобы поддержка ES5 (при необходимости)
.replace(/\n\n((?:\n\n)+)/g, function (_,x) { return "\n\n" + x.replace(/\n\n/g, '<br>'); })
или, если вы нацелены на ECMAScript2018 +:
.replace(/(?<=\n\n)\n\n/g, '<br>')
Подробности
\n\n
- две новые строки ((?:\n\n)+)
- Группа захвата 1, соответствующая одному или нескольким (+
) вхождениям последовательности символов \n\n
(обратите внимание, что она создана последовательностью с использованием группы без захвата, (?:...)
, где расположены \n\n
)
В замене используется метод обратного вызова. Он принимает все совпадения (_
) и значение группы 1 (x
). Возвращаемое значение "\n\n"
плюс результат x.replace(/\n\n/g, '<br>')
, все \n\n
заменены на <br>
.
Шаблон /(?<=\n\n)\n\n/g
соответствует всем вхождениям (g
) из \n\n
непосредственно перед ним стоит \n\n
(см. положительный взгляд (?<=\n\n)
).
JS демо:
var markdown = "First Line\n\nNo Blank Line above this\n\n\n\n\n\nThere are two empty new lines above this.\n\nNo empty line above this."
console.log(markdown.replace(/\n\n((?:\n\n)+)/g, function (_,x) { return "\n\n" + x.replace(/\n\n/g, '<br>'); }));