我正在使用一个自定义解析函数,在该函数中我需要解析一个字符串
带有<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>
答案 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>'))