Regex BBcode:忽略(转义)特殊标记中的所有标记(在JavaScript中)
我正在用一组标记和替换来解析一些文本。例如,要使文本Regex BBcode:忽略(转义)特殊标记中的所有标记(在JavaScript中),javascript,regex,markdown,bbcode,Javascript,Regex,Markdown,Bbcode,我正在用一组标记和替换来解析一些文本。例如,要使文本**由双星号**加粗包围,我使用/\*\*([\s\s]+?)\*\*/gm作为图案,使用“$1”作为替换。但我想提供的是原始文本,就像我在这个问题上做的一样。因此,我需要一个表达式,它“匹配任何字符,包括由双星号包围的空格和换行符,但不由反勾号包围,反勾号和双星号之间有(可选)字符/空格/换行符” 示例。 输入字符串:“Lorem``ipsum**dolor**sit``amet,**concertetur**adipising elit”
**由双星号**
加粗包围,我使用/\*\*([\s\s]+?)\*\*/gm
作为图案,使用“$1”
作为替换。但我想提供的是原始文本,就像我在这个问题上做的一样。因此,我需要一个表达式,它“匹配任何字符,包括由双星号包围的空格和换行符,但不由反勾号包围,反勾号和双星号之间有(可选)字符/空格/换行符”
示例。
输入字符串:“Lorem``ipsum**dolor**sit``amet,**concertetur**adipising elit”
结果:“Lorem ipsum**dolor**sit amet,concerteturadipising elit”
我尝试了不匹配的组和lookaheads,但没有效果。我知道这可以通过例如用html实体替换字符或仅仅使用一些标记解析器来实现,但出于兴趣,如何通过纯正则表达式魔术来实现呢?使用lookbehind断言,生活会更简单
/((`)[\s\S]*?)?\*\*([\s\S]+?)\*\*([\s\S]*?\2)/gm
如果第一个组为空,则最后一个组将匹配空字符串
然后我们过滤结果
var str = "Lorem `ipsum **dolor** sit` amet, **consectetur** adipisicing elit dolor `**sit amet**` adi";
str = str.replace(/((`)[\s\S]*?)?\*\*([\s\S]+?)\*\*([\s\S]*?\2)/gm, function(m, p1, p2, p3, p4){
return p1 && p4 ? m : "<b>" + p3 + "</b>";
});
var str=“Lorem`ipsum**dolor**sit`amet,**concetetur**adipising elite dolor`**sit amet**adi”;
str=str.replace(/((`)[\s\s]*?)?\***([\s\s]+?)\****([\s\s]*?\2)/gm,函数(m,p1,p2,p3,p4){
返回p1和p4?m:“+p3+”;
});
返回p1和p4?m:”“+p3+”“;
如果p1
和p4
不是空的/未定义的,这意味着我们匹配的字符串以反勾号开始和结束。我们不做任何更改就退回它
此示例输出:
Lorem`ipsum**dolor**sit`amet,奉献告别精英
多洛`**坐在我身边**`adi
在我看来,这有点棘手。但正如你所指出的,这只是为了兴趣 类似这样的话:“Lorem``ipsum**dolor**sit``amet,**concertetur**adipising elit”
Dolor
不应变为粗体,因为ipsum**Dolor**sit
被反勾号包围(我在这里使用双反勾号只是为了转义它们),而concertetur与表达式匹配并变为黑色。
var str = "Lorem `ipsum **dolor** sit` amet, **consectetur** adipisicing elit dolor `**sit amet**` adi";
str = str.replace(/((`)[\s\S]*?)?\*\*([\s\S]+?)\*\*([\s\S]*?\2)/gm, function(m, p1, p2, p3, p4){
return p1 && p4 ? m : "<b>" + p3 + "</b>";
});
return p1 && p4 ? m : "<b>" + p3 + "</b>";