使用正则表达式将 markdown 链接转换为 a 链接

背景

在使用 markdown 的超链接语法 [text](link) 时,无法支持 a 标签的属性(例如 targetrel

所以希望将现有用 markdown 链接语法的内容批量替换成 a 标签

正则解析

通过正则表达式 (?<!!)\[(.*?)\]\((.*?)\) 即可完成匹配,其中 $1 分组为链接文字, $2 分组为链接地址。

整个正则表达式分为三部分:

  1. 第一部分 (?<!!) 向后否定断言,表示不匹配以 ! 开始的内容,避免误伤到 markdown 的图片语法 ![text](img src);
  2. 第二部分 \[(.*?)\] 匹配 markdown 链接语法的前半部分 [text],并将结果保存到 $1 分组;
  3. 第三部分 \((.*?)\) 匹配 markdown 链接语法的前半部分 (link),并将结果保存到 $2 分组;

使用

const str = `balabala![img](https://path.to.img) balabala [text](http://path.to.link) balabala`;
const reg = /(?<!!)\[(.*?)\]\((.*?)\)/ig;
const result = str.replace(reg, `[$1]($2)`);
console.log(result);

相关链接

向后否定断言 | MDN

正则表达式在线验证工具