首页 > 解决方案 > 正则表达式将 Markdown 中的文本 URL 转换为链接

问题描述

我正在尝试将 Markdown 文本中的文本链接(使用 FQDN,即没有相对链接)转换为 Markdown 链接。它工作正常,除非源降价已经将文本转换为链接。例如,这是源文本:

Login in to My site [https://example.com/](https://example.com/) and select Something > Select below details further.
(https://example.com/abc/1.html)

Also have a look at https://example.com/abc/1.html

我的正则表达式:/(?<!\]\()(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gim

预期:仅匹配第二个和第三个链接。当前结果:匹配 3 个 URL。

我尝试在末尾添加一个否定的lookahead,类似于开头的否定lookbehind,但它只是省略了URL的最后一个字符,这是一个无赖!

我在 NodeJS 中使用它。

这是带有示例数据的 regex101的链接

标签: node.jsregexregex-lookarounds

解决方案


您可以使用模式来匹配您不想要的内容,并在第 1 组中捕获您想要的内容。

替换时可以使用replace的回调函数。

您可以检查 id group 1 是否存在。如果是这样,请用您的自定义替换替换。如果不存在,则替换为完全匹配

\[(?:https?|ftp):\/\/[^\]\[]+\]\([^()]*\)|((?:https?|ftp):\/\/\S+)

部分模式匹配:

  • \[匹配[
  • (?:https?|ftp):\/\/匹配协议之一和://
  • [^\]\[]+匹配任何字符的 1 次以上,除了[]
  • \]匹配]
  • \([^()]*\)匹配从(直到)
  • |或者
  • ((?:https?|ftp):\/\/\S+)在第 1 组中捕获类似格式的 url

正则表达式演示

不匹配 url 中的括号:

\[(?:https?|ftp):\/\/[^\]\[]+\]\([^()]*\)|((?:https?|ftp):\/\/[^()\s]+)

正则表达式演示

或者专门捕获括号之间的网址:

\[(?:https?|ftp):\/\/[^\]\[]+\]\([^()]*\)|\(((?:https?|ftp):\/\/\S+)\)|((?:https?|ftp):\/\/[^()\s]+)

正则表达式演示


推荐阅读