如何用正则表达式匹配文档中跨多行的多条目内容?
匹配跨多行含特定标记的JSDoc注释块
嘿,我完全懂你折腾数小时却摸不着头绪的挫败感——跨多行正则匹配确实是新手容易踩坑的点!针对你要提取包含#start?标记的跨多行JSDoc注释需求,我给你整理了一个实用的解决方案:
核心正则表达式
/\/\*\*[\s\S]*?\* #start\?[\s\S]*?\*\//g
逐段解释(帮你搞懂每部分的作用)
/\/\*\*/:精准匹配JSDoc的起始标记/**,这里要转义/和*这两个正则特殊字符[\s\S]*?:非贪婪匹配任意字符(包括换行),*?是关键——它会在找到下一个目标时立刻停止,避免把后续无关的注释也一起匹配进来\* #start\?:匹配包含#start?的那一行,同样要转义*和?这两个特殊字符[\s\S]*?:继续非贪婪匹配,直到找到JSDoc的结束标记\*\//:匹配JSDoc的结束标记*/g:全局匹配标志,确保文档中所有符合条件的注释块都会被找到
实际使用示例
下面是用JavaScript测试的代码,你可以直接套用:
const docContent = `// javascript.js /** * #start? * @name myFunction(p1) * @desc Description of the function * 这里可以是任意多行内容 */ function myFunction(p1) { // 函数逻辑 } /** * 这个注释没有#start?标记,不会被匹配 * @name otherFunc */ function otherFunc() { // ... }`; // 应用正则 const targetRegex = /\/\*\*[\s\S]*?\* #start\?[\s\S]*?\*\//g; const matchedBlocks = docContent.match(targetRegex); console.log(matchedBlocks); // 输出结果会是第一个完整的含#start?的JSDoc块
额外注意事项
- 一定要用非贪婪模式(
*?),如果换成贪婪的*,正则会从第一个/**直接匹配到最后一个*/,把所有注释都混在一起,这绝对不是你想要的 - 如果你的文档里存在不符合规范的嵌套注释(正常JSDoc不允许这种情况),这个正则可能会出错,但在常规的JS代码文档场景下完全够用
- 要是你需要更严格的匹配(比如要求
#start?必须是星号后的第一个内容),可以把\* #start\?调整为\* #start\?\s*$,确保它是单独一行的标记
内容的提问来源于stack exchange,提问作者ful-stackz
相关产品推荐
相关产品推荐

