Regex для замены \ n \ n после каждого второго вхождения в JS - PullRequest
1 голос
/ 08 апреля 2020

Я конвертирую html в markdown и наоборот.

Когда я конвертирую html с несколькими пустыми строками, я получаю следующую уценку.

"First Line↵↵ (Shouldn't be replaced)
 No Blank Line above this↵↵ (Shouldn't be replaced)
 ↵↵ (to be replaced)
 ↵↵  (to be replaced)
There are two empty new lines above this.↵↵ (Shouldn't be replaced)
 No empty line above this."

Сейчас Если я использую markdown.replace(/\n\n/g, '<br>'), то он заменяет \n\n там, где это не должно нравиться в First Line.

Я не могу сделать регулярное выражение, которое может это сделать. Я также попробовал регулярное выражение с \b, но у меня это не сработало. Буду признателен за любую помощь.

Я добавил пробел в строке уценки для наглядности. В общем, я получаю полную строку вроде этого: "

"First Line↵↵No Blank Line above this↵↵↵↵↵↵There are two empty new lines above this.↵↵No empty line above this."

1 Ответ

1 голос
/ 08 апреля 2020

Вы можете сопоставить двойной символ 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>'); }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...