gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:13:14 30 4
gpt4 key购买 nike

我正在尝试编写一个基本的 Markdown 解析器,并且我想构建一个可以检测链接和强调的正则表达式。

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

我检测强调没有问题,检测链接也没有问题,但是当链接中有下划线时,例如 http://example.com/link_to_article ,我的解析器检测到 _to_作为一种强调的尝试。

我该如何阻止?

我的第一次尝试是确保第一个下划线之前或第二个下划线之后没有字符,但是内联强调是完全有效的,如 Stackoverflow 上所示,例如 intere_stin_g完全有效,在脚下射出这个想法。

那么我将如何实现这一点?

最佳答案

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

  • 一个大而花哨的正则表达式,看起来像这样:
    (?<!\(\s*\S+)_([^_]+)_(?!\S+(?:\s+"[^"]")\s*\))

    我强烈建议不要使用这种方法,因为即使是这种怪物也不完全符合标准,而且……我的意思是,谁想尝试破译它?即使将其拆分为多行也只会让它变得更好一点。此外,根据您的正则表达式引擎,甚至可能不接受后视。
  • 使用 _ 禁止字中斜体.这使您的正则表达式变得更加简单:
    \b_[^_]+_\b

    堆栈溢出就是这样做的。
  • 围绕基于流的设计定位您的整个程序,在那里您匹配片段并在处理字符串时解析它们。这有点难以编码,但基本上是:
  • 找到第一个看起来像斜体的东西
  • 找到第一个看起来像链接的东西
  • 根据哪个更早匹配对其进行格式化。

  • 注意:我放了 [^_]在一些地方,这不是严格准确的;更准确的是 (?:(?<!\\)(\\\\)*\\_|[^_])+ ;即一系列转义 _或非 _人物。或者,你可以做一些类似于 _.*?(?<!\\)(\\\\)*_ 的事情。 ;即匹配来自 _直到下一个未转义 _ .

    附言如果您想了解有关正则表达式的更多信息,有很多方便的工具可以帮助您,例如 online parserstutorials

    关于regex - 构建 Markdown 解析器。是否可以检测链接而不检测其中的下划线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27477649/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com