node.js - 正则表达式将 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 中使用它。
解决方案
您可以使用模式来匹配您不想要的内容,并在第 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]+)
推荐阅读
- javascript - 如何正确展平可观察的流?
- vue.js - Vuejs DevTools 未在开发人员工具中显示面板
- wpf - 在 customContrl 中修改数据内容时捕获
- javascript - Ajax 调用中的 onclick
- discord.js - 如何错误处理我的不和谐机器人无法加入语音频道?
- python - 如何在python中为测验创建计时器?
- laravel - Laravel 上的 ReCaptcha
- jekyll - 从主页/任何其他页面获取 Jekyll Pages 中特定帖子的阅读时间
- linux - yum 更新失败,出现“事务检查与 depsolve 错误:”但没有列出冲突的包
- c# - C# 是否有一种方法可以自动同步/锁定对象上的所有方法?