如何用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));
正则说明
项目匹配正则:
/##\s+(.*?)\s*([\s\S]*?)(?=##|$)/g##\s+:定位二级标题开头(.*?):非贪婪捕获项目名称(避免包含后续空白字符)([\s\S]*?):捕获项目下所有内容([\s\S]匹配任意字符,包括换行;非贪婪模式确保不会跨项目捕获内容)(?=##|$):正向预查,匹配到下一个二级标题或文件结尾时停止,精准划分项目边界
任务匹配正则:
/- \[ \]\s+(.*)/g- \[ \]:精准匹配未完成任务的标记格式(.*):捕获任务的文本内容
运行结果
执行上述代码后,会输出:
Project A, an undone task Project B, an uncompleted task Project C, uncompleted task
内容的提问来源于stack exchange,提问作者derekvan
相关产品推荐
相关产品推荐

