JavaScript正则问题:无法匹配嵌套的ac:structured-macro标签
解决JavaScript正则匹配嵌套ac:structured-macro标签的问题
你的核心问题是原正则的非贪婪匹配会在遇到第一个闭合标签时停止,无法处理嵌套的同类型标签。在ES2018及以上版本的JavaScript环境(现代浏览器、Node.js 10+)中,可以利用命名捕获组的递归匹配来解决这个问题,通过计数嵌套层级确保匹配到最外层的闭合标签。
修改后的正则表达式
const regex = /(<ac:structured-macro[^>]*?ac:name="table-chart"[^>]*>)(?:[\s\S]*?(?:<ac:structured-macro[^>]*>(?<depth>)|</ac:structured-macro>(?<-depth>)))*?(?(depth)(?!))(</ac:structured-macro>)/g;
正则逻辑说明
- 匹配外层起始标签:
(<ac:structured-macro[^>]*?ac:name="table-chart"[^>]*>)- 精准捕获
ac:name为table-chart的外层起始标签,避免误匹配其他同类型标签。
- 精准捕获
- 处理嵌套内容:
(?:[\s\S]*?(?:<ac:structured-macro[^>]*>(?<depth>)|</ac:structured-macro>(?<-depth>)))*?[\s\S]匹配任意字符(包括换行),替代原正则的(.|\n)更简洁。- 用命名捕获组
depth计数嵌套层级:遇到起始标签时depth加1,遇到闭合标签时depth减1。
- 确保匹配最外层闭合标签:
(?(depth)(?!))- 这是一个条件断言,当
depth不为0时(仍有未闭合的嵌套标签),匹配失败,直到depth归0才继续匹配外层的闭合标签。
- 这是一个条件断言,当
- 匹配外层闭合标签:
(</ac:structured-macro>)
使用示例
const content = ` <ac:structured-macro ac:name="table-chart"> <ac:parameter>...</ac:parameter> <ac:structured-macro ac:name="jira"> <ac:parameter>...</ac:parameter> </ac:structured-macro> </ac:structured-macro> `; const matches = [...content.matchAll(regex)]; if (matches.length > 0) { const fullMatch = matches[0][0]; // 完整的外层标签内容 console.log(fullMatch); }
注意事项
- 如果你的运行环境不支持ES2018正则特性,建议改用DOM解析的方式处理嵌套标签(比如创建临时DOM元素,通过选择器定位目标标签),正则处理嵌套HTML标签本身就有局限性,DOM解析更可靠。
内容的提问来源于stack exchange,提问作者Benni
相关产品推荐
相关产品推荐

