用<b>替换重复出现的&&,用<i>替换%%

时间:2018-11-14 04:08:47

标签: javascript regex html-parsing regex-group

我正在使用一个自定义解析函数,在该函数中我需要解析一个字符串 带有<b>的&&和带有<i>标签的%%的重复出现。

我尝试了这个正则表达式。

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

上面的替换对于单个组来说很好用

“ && This &&是一个&&粗体字符串&&”到“ 是一个粗体字符串

这给我重复字符串带来了奇怪的结果

&&&&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 :(得分:2)

一种选择是连续匹配尽可能多的&,至少需要两个:

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或{ {1}},因此您以后可以反向引用整个子字符串:

%

如果部分没有整齐地嵌套在其他部分中(例如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:

%%

答案 1 :(得分:0)

如果我正确理解了您的问题,那么可以采用以下解决方案:

&&&&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>'))