Замените несколько и повторяющиеся вхождения && на <b>и %% на <i> - PullRequest
0 голосов
/ 14 ноября 2018

Я работаю над пользовательской функцией синтаксического анализа, где мне нужно проанализировать строку с несколькими и повторными вхождениями && с <b> и %% с тегом <i>.

Я пробовал это регулярное выражение.

html = html.replace(/[&][&](.+?)[&][&]/g, '<b>$1</b>');
html = html.replace(/[%][%](.+?)[%][%]/g, '<i>$1</i>');

вышеприведенная замена отлично работает для одной группы, я имею в виду

"&&. Это && жирная строка &&" до " это жирная строка "

Это дает странные результаты, я повторил строки

&&&&This&&&& is a &&bold string&& 

до <b>&&This</b>&& is a <b>bold String</b>

нужна помощь в разборе закрывающей и открывающей группы, чтобы заменить ее насоответствующие html-теги, такие как

до <b><b>This</b></b> is a <b>bold String</b>

и, если возможно, замена их только одним тегом <b>

до <b>This</b> is a <b>bold String</b>

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Если я правильно понимаю ваш вопрос, то решение для преобразования:

&&&&This&&&& is a &&bold string&& 

до:

<b><b>This</b></b> is a <b>bold String</b>

будет:

console.log('&&&&This&&&& is a &&bold string&& '
.replace(/&&(.*?)&&/g, '<b>$1</b>'))
0 голосов
/ 14 ноября 2018

Один вариант будет соответствовать как можно большему количеству & с подряд, требуя как минимум два:

console.log(
  '&&&&This&&&& is a &&bold string&&'
    .replace(/&{2,}(.*?)&{2,}/g, '<b>$1</b>')
);

Обратите внимание, что если вы хотите заменить оба & с тегами <b> и % с тегами <i>, вы можете использовать одно регулярное выражениес функцией замены, которая обращается к объекту:

const obj = {
  '&': 'b',
  '%': 'i'
};
console.log(
  '&&&&This&&&& is a &&bold string&& and there are italics %%here%%%'
    .replace(
      /([%&])\1+(.*?)\1{2,}/g,
      (_, char, text) => `<${obj[char]}>${text}</${obj[char]}>`
    )
);

Если вы хотите, чтобы группы на каждом конце были сбалансированными , то вместо того, чтобы захватывать только один символ в группе, также запишитецелая подстрока из & s или % s, поэтому вы можете ссылаться на всю эту подстроку позже:

const obj = {
  '&': 'b',
  '%': 'i'
};
console.log(
  '&&&&This&& is a &&bold string&& and there are italics %%here%%%'
    .replace(
      /(([%&])\2+)(.+?)\1/g,
      (_, _2, char, text) => `<${obj[char]}>${text}</${obj[char]}>`
    )
);

Если разделы не аккуратно вложены в другие разделы (например, <b>foo<i>bar</b>baz</i>), вам придется использовать оригинальный метод замены && s, изатем снова пройдем строку и заменим %% s:

console.log(
  '&&&&This&& is a &&bold string&& and there are italics %%here%%%'
    .replace(/(&{2,})(.+?)\1/g, '<b>$2</b>')
    .replace(/(%{2,})(.+?)\1/g, '<i>$2</i>')
);
...