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

Regex 构建降价解析器。是否可以检测链接而不检测其中的下划线?,regex,Regex,我正在尝试编写一个基本的标记解析器,我想构建一个能够检测链接和强调的正则表达式 在标记中,链接看起来像[text](URL),而强调/斜体看起来像*text*或\u text 我检测强调没有问题,检测链接也没有问题,但是当链接中有下划线时,例如http://example.com/link_to_article,我的解析器检测到\u到试图强调 我该怎么阻止这一切 我的第一次尝试是确保在第一个下划线之前或第二个下划线之后没有字符,但是内联强调是完全有效的,正如在Stackoverflow上看到的,

我正在尝试编写一个基本的标记解析器,我想构建一个能够检测链接和强调的正则表达式

在标记中,链接看起来像
[text](URL)
,而强调/斜体看起来像
*text*
\u text

我检测强调没有问题,检测链接也没有问题,但是当链接中有下划线时,例如
http://example.com/link_to_article
,我的解析器检测到
\u到
试图强调

我该怎么阻止这一切

我的第一次尝试是确保在第一个下划线之前或第二个下划线之后没有字符,但是内联强调是完全有效的,正如在Stackoverflow上看到的,因此像
intere_stin_g
这样的例子是完全有效的,这一想法是完全正确的


那么我该如何做到这一点呢?

主要有三种方法

  • 一个大的,奇特的正则表达式,看起来像这样:

    (?<!\(\s*\S+)_([^_]+)_(?!\S+(?:\s+"[^"]")\s*\))
    
    堆栈溢出就是这样做的

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

  • 找到第一个看起来像斜体的东西
  • 找到第一个看起来像链接的东西
  • 根据先前匹配的设置格式
  • 注意:我把
    [^\u]
    放在了一些地方,但这些地方并不准确;更准确的是
    (?:(?;即一系列转义的
    \u
    或非
    \u
    字符。或者,您可以大致执行类似
    .*(?;即从
    \u
    匹配到下一个未转义的
    \u



    另外,如果你想了解更多关于regex的信息,有很多方便的工具可以帮助你,比如和

    ,除非你提出一些规则来区分
    链接到文章
    (非强调)和
    插入
    (强调)这是无法避免的。只需先检测链接,不要在已经分类为URL的文本中查找强调。带星号的内联强调是有效的,但我认为堆栈溢出使用了一种标记的变体,它不能识别带下划线的单词间强调。@DougSmith:我在看原始文章,你使用了ast正如我的评论所说,星号确实有词间强调,但在Stack Overflow的Markdown变体中,下划线没有。
    \b_[^_]+_\b