构建Markdown解析器。是否可以检测链接而不检测其中的下划线?

时间:2014-12-15 05:01:41

标签: regex

我试图编写一个基本的Markdown解析器,我想构建一个可以检测链接和重点的正则表达式。

在Markdown中,链接看起来像[text](URL),强调/斜体看起来像*text*_text_

检测重点没有问题,我也没有检测到链接的问题,但是当链接中有下划线时,例如http://example.com/link_to_article,我的解析器会将_to_视为重点尝试。

如何阻止此事?

我的第一次尝试是确保在第一个下划线之前或第二个下划线之后没有字符,但内联强调完全有效,如Stac koverfl ow所示,所以像{{1完全有效,在脚下拍摄这个想法。

那我该如何实现呢?

1 个答案:

答案 0 :(得分:3)

有三种主要方法可以做到这一点。

  1. 一个很大的,花哨的正则表达式,看起来像这样:

    (?<!\(\s*\S+)_([^_]+)_(?!\S+(?:\s+"[^"]")\s*\))
    

    强烈建议不要使用这种方法,因为即使是那种怪异也不完全符合标准,而且......我的意思是,谁想要破译那个?即使将它分成多行也只会使它更好一些。此外,根据您的正则表达式引擎,可能甚至不接受这种后视。

  2. 使用_禁止使用中间斜体字。这使你的正则表达式变得更加简单:

    \b_[^_]+_\b
    

    Stack Overflow就是这样做的。

  3. 围绕基于流的设计定位整个程序,在此设计中匹配片段并在处理字符串时解析它们。这有点难以编码,但基本上是:

    1. 找出看起来像斜体的第一件事
    2. 找到第一个看似链接的东西
    3. 根据之前匹配的格式对其进行格式化。
  4. 注意:当{em>严格准确无误时,我将[^_]放在几个地方;更准确的是(?:(?<!\\)(\\\\)*\\_|[^_])+;即一系列转义的_或非_字符。或者,您可以执行大致类似_.*?(?<!\\)(\\\\)*_的操作;即从_匹配到下一个未转义的_

    P.S。如果您想了解有关正则表达式的更多信息,可以使用许多方便的工具来帮助您,例如online parserstutorials