本文详解如何在 java 中编写一个能**统一匹配带/不带尺寸提示的 markdown 链接**的正则表达式,通过非捕获组与可选分组实现条件捕获,确保有 `"icon"` 等修饰时提取值,无修饰时仍能完整匹配链接。
在将 Markdown 转换为 HTML 的过程中,常需解析形如 [text](url "size") 的链接语法。其中 "icon"、"small"、"medium"、"big" 是可选的尺寸提示(size hint),用于后续生成带 data-size 或 class 属性的 标签;而纯 [text](url) 形式也必须兼容。关键挑战在于:既要保证所有测试用例全部匹配,又要让尺寸字段仅在存在时被捕获为独立分组(group 3),不存在时不产生空捕获或匹配失败。
正确解法是使用非贪婪匹配 + 非捕获可选组((?: ... )?),并把引号和空格纳入该组内部:
\[(.*)]\((.*?)(?:\s+"(icon|small|medium|big)")?\)
✅ 各部分解析如下:

⚠️ 重要注意事项:
String regex = "\\[(.*)]\\((.*?)(?:\\s+\"(icon|small|medium|big)\")?\\)";
Pattern pattern = Pattern.compile(regex);
Matcher m = pattern.matcher("[link 1](https://aka.ms/aadrecoverykey \"small\")");
if (m.find()) {
String text = m.group(1); // "link 1"
String url = m.group(2); // "https://aka.ms/aadrecoverykey"
String size = m.group(3); // "small"(若无尺寸,则为 null)
// 构造 HTML:text
}总结:条件捕获的本质不是“让分组变可选”,而是将可选内容封装进非捕获组中,并在组内定义真正需要提取的捕获子组。配合非贪婪量词,即可优雅支撑 Markdown 解析中常见的“有/无修饰符”双模匹配场景。