我正在用一组标签解析一些文本并替换。例如,要使文字**surrounded by double astersks**
粗体,我使用/\*\*([\s\S]+?)\*\*/gm
作为模式,"<b>$1</b>"
作为替换。但我想提供的原始文本就像我在这个问题中所做的那样。所以我需要一个“匹配任何字符的表达式,包括由双星号包围的空格和换行符,但不包括反引号,其中(可选)字符/空格/换行符在反引号和双星号之间”
示例。
输入字符串:"Lorem ``ipsum **dolor** sit`` amet, **consectetur** adipisicing elit"
结果:“Lorem ipsum ** dolor ** sit amet, consectetur adipisicing elit”
我尝试了不匹配的群体和先行,但无济于事。我知道它可以通过例如用html实体替换字符或者只是使用一些Markdown解析器来完成,但只是为了感兴趣,如何通过纯正的Regex魔法来完成?
答案 0 :(得分:0)
使用外观断言,生活会变得更简单。
/((`)[\s\S]*?)?\*\*([\s\S]+?)\*\*([\s\S]*?\2)/gm
((`)[\s\S]*?)? #capture any characters (or none) preceded by a backtick (captured for a later use in the RE). Optionnal - non-greedy.
\*\*([\s\S]+?)\*\* #capture any characters surrounded by asterisks.
([\s\S]*?\2) #capture any characters (including empty string) followed by the capture #2 (empty or backtick).
如果第一组为空,则最后一组将匹配空字符串。
然后我们过滤结果。
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>";
如果p1
和p4
不为空/未定义,则表示我们的匹配字符串以反引号开头和结尾。我们无需更改即可将其退回。
此示例输出:
Lorem`ipsum ** dolor ** sit` amet, consectetur adipisicing elit dolor` ** sit amet **`adi
这有点棘手,imo。但正如你所指出的那样,这只是为了感兴趣。 ;)