我试图编写一个基本的Markdown解析器,我想构建一个可以检测链接和重点的正则表达式。
在Markdown中,链接看起来像[text](URL)
,强调/斜体看起来像*text*
或_text_
。
检测重点没有问题,我也没有检测到链接的问题,但是当链接中有下划线时,例如http://example.com/link_to_article
,我的解析器会将_to_
视为重点尝试。
如何阻止此事?
我的第一次尝试是确保在第一个下划线之前或第二个下划线之后没有字符,但内联强调完全有效,如Stac koverfl ow所示,所以像{{1完全有效,在脚下拍摄这个想法。
那我该如何实现呢?
答案 0 :(得分:3)
有三种主要方法可以做到这一点。
一个很大的,花哨的正则表达式,看起来像这样:
(?<!\(\s*\S+)_([^_]+)_(?!\S+(?:\s+"[^"]")\s*\))
我强烈建议不要使用这种方法,因为即使是那种怪异也不完全符合标准,而且......我的意思是,谁想要破译那个?即使将它分成多行也只会使它更好一些。此外,根据您的正则表达式引擎,可能甚至不接受这种后视。
使用_
禁止使用中间斜体字。这使你的正则表达式变得更加简单:
\b_[^_]+_\b
Stack Overflow就是这样做的。
围绕基于流的设计定位整个程序,在此设计中匹配片段并在处理字符串时解析它们。这有点难以编码,但基本上是:
注意:当{em>严格准确无误时,我将[^_]
放在几个地方;更准确的是(?:(?<!\\)(\\\\)*\\_|[^_])+
;即一系列转义的_
或非_
字符。或者,您可以执行大致类似_.*?(?<!\\)(\\\\)*_
的操作;即从_
匹配到下一个未转义的_
。
P.S。如果您想了解有关正则表达式的更多信息,可以使用许多方便的工具来帮助您,例如online parsers和tutorials