0

我正在用一组标签和替换来解析一些文本。例如,为了使文本变为**surrounded by double astersks** 粗体,我将/\*\*([\s\S]+?)\*\*/gm其用于模式和"<b>$1</b>"替换。但是我还想提供原始文本,就像我在这个问题中所做的那样。所以我需要一个表达式“匹配任何字符,包括被双星号包围的空格和换行符,但不被反引号包围,在反引号和双星号之间有(可选)字符/空格/换行符”

例子。

输入字符串:"Lorem ``ipsum **dolor** sit`` amet, **consectetur** adipisicing elit"

结果:“Lorem ipsum **dolor** sat amet, consectetur adipisicing elit

我尝试了不匹配的组和前瞻,但无济于事。我知道这可以通过例如用 html 实体替换字符或只使用一些 Markdown 解析器来完成,但只是为了感兴趣,如何通过纯正则表达式魔法来完成?

4

1 回答 1

0

使用lookbehind断言,生活会更简单。

/((`)[\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>";

如果p1andp4不为空/未定义,这意味着我们匹配的字符串以反引号开始和结束。我们将其原封不动地退回。

此示例输出:

Lorem `ipsum **dolor** sit` amet, consectetur adipisicing elit dolor `**sit amet**` adi

这有点棘手,imo。但正如您所指出的,这只是为了利益。;)

于 2013-08-30T14:39:15.523 回答