You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript正则匹配Markdown中未完成任务及所属项目标题

提取Markdown未完成任务及对应项目的JS实现

正则思路与代码实现

要适配不同项目的内容长度,不能依赖固定行数,而是通过匹配项目边界和非贪婪捕获来实现:

const markdown = `# Top of File

## Project A
Descriptive line

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec finibus elit non nibh lobortis molestie.

- [ ] an undone task
- [x] a completed task
- [x] second completed task

## Project B
Descriptive line

- [x] a completed task
- [ ] an uncompleted task

## Project C
Descriptive line

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec finibus elit non nibh lobortis molestie.

- [x] completed task
- [ ] uncompleted task
- [x] completed task`;

// 匹配每个项目的标题和内容
const projectPattern = /##\s+(.*?)\s*([\s\S]*?)(?=##|$)/g;
const results = [];

let projectMatch;
while ((projectMatch = projectPattern.exec(markdown)) !== null) {
  const projectName = projectMatch[1].trim();
  const projectContent = projectMatch[2];
  
  // 匹配当前项目下的所有未完成任务
  const taskPattern = /- \[ \]\s+(.*)/g;
  let taskMatch;
  while ((taskMatch = taskPattern.exec(projectContent)) !== null) {
    const taskText = taskMatch[1].trim();
    results.push(`${projectName}, ${taskText}`);
  }
}

// 输出结果
results.forEach(item => console.log(item));

正则说明

  1. 项目匹配正则:/##\s+(.*?)\s*([\s\S]*?)(?=##|$)/g

    • ##\s+:定位二级标题开头
    • (.*?):非贪婪捕获项目名称(避免包含后续空白字符)
    • ([\s\S]*?):捕获项目下所有内容([\s\S]匹配任意字符,包括换行;非贪婪模式确保不会跨项目捕获内容)
    • (?=##|$):正向预查,匹配到下一个二级标题或文件结尾时停止,精准划分项目边界
  2. 任务匹配正则:/- \[ \]\s+(.*)/g

    • - \[ \]:精准匹配未完成任务的标记格式
    • (.*):捕获任务的文本内容

运行结果

执行上述代码后,会输出:

Project A, an undone task
Project B, an uncompleted task
Project C, uncompleted task

内容的提问来源于stack exchange,提问作者derekvan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:20:29