Один вариант будет соответствовать как можно большему количеству &
с подряд, требуя как минимум два:
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>')
);