【问题标题】:Regex BBcode: ignore (escape) all the markup in special tag (in JavaScript)正则表达式 BBcode:忽略(转义)特殊标记中的所有标记(在 JavaScript 中)
【发布时间】:2013-08-27 15:08:40
【问题描述】:

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

示例。

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

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

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

【问题讨论】:

  • 类似这样的:"Lorem ``ipsum **dolor** sit`` amet, **consectetur** adipisicing elit"Dolor 不应变为粗体,因为 ipsum **dolor** sit 被反引号包围(我在这里使用双反引号只是为了逃避它们),而 consectetur 匹配表达式并变为黑色。

标签: javascript regex markdown bbcode


【解决方案1】:

使用lookbehind assertions会让生活更简单。

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

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

这个例子输出:

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

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

【讨论】:

    猜你喜欢
    • 2018-05-30
    • 2022-07-29
    • 2012-03-22
    • 2012-07-29
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多