正则匹配嵌套标签内容百度找了几个嵌套正则都无法满足我的要求。示例字符串原使用正则#if.*?\/#if #if #if aaa /#if ccc /#ifbbb#ifddd/#if需要替换#if/#if标签内容为空最终效果应只保留bbb因为bbb没有被标签包含匹配思路使用单个标签匹配逐级替换内容后再重新匹配。主要判断在中间过程中不包含标签头的内容。不包含头就不需要判断标签尾。html应该标签类似同理可将子标签替换为{div1}、{div2}等形式需要恢复时再进行内容还原实现过程此方案虽然能够实现最终留下bbb但不支持#if中包含符号如12。不符合匹配思路 #if[^#if]*[^/#if]*/#if百度之后使用新写法参考地址https://blog.csdn.net/xiiii/article/details/89450341最终正则即在原匹配单个标签正则中增加不包含标签头的判断#if((?!#if).)*?\/#if \1代表第一个匹配内容这样单标签匹配只需要改头尾就行 (#if)((?!\1).)*?/#if参考示例代码let oldSqlCode #if #if aaa /#if ccc /#ifbbb#ifddd/#if; //2024.03.08 格式化之前注释不可识别内容 //需要注释最外层的#if标签 // console.log(oldSqlCode:,oldSqlCode) let newSqlCode oldSqlCode; let ifPattern /(#if)((?!\1).)*?\/#if/gim; let parentIndex 0; let tempIfs new Map(); let matches; while(ifPattern.test(newSqlCode)){//嵌套一次多循环一次保证#if标签正确替换为空 matches newSqlCode.match(ifPattern); // console.log(matches:,matches) parentIndex; for (let i 0; i matches.length; i) { let tempKey if-parentIndex-(i1); tempIfs.set(tempKey,matches[i]); newSqlCode newSqlCode.replaceAll(matches[i],tempKey);//替换if标签内容 } // console.log(newSqlCode:,newSqlCode) } // console.log(tempIfs:,tempIfs) //先按if-x-x格式替换为/*if-x-x*/注释格式后再还原内容 // let explanatory newSqlCode newSqlCode.replaceAll(/(if-\d-\d)/gim,/*\$1*/);//替换if标签内容 //if重复格式化会导致注释嵌套替换重复注释只保留一个 newSqlCode newSqlCode.replaceAll(/*/*,/*).replaceAll(*/*/,*/); // console.log(newSqlCode:,newSqlCode) //需要倒序遍历还原如if-2-1中会包含if-1-x // console.log(tempIfs.size-1) for (let i tempIfs.size-1; i 0; i--) { let key Array.from(tempIfs.keys())[i]; // console.log(key:,key) let val tempIfs.get(key); // console.log(key:val); //开始还原操作 newSqlCode newSqlCode.replaceAll(key,val);//替换if标签内容 } // console.log(最终注释结果newSqlCode:,newSqlCode) // 调用格式化控件将关键字转大写 newSqlCode format(newSqlCode,{language:dsType,uppercase: true}); newSqlCode newSqlCode.replaceAll({ reorder },\n/*{reorder}*/) .replaceAll(/where(\n.*)1\s*\s*1/gim, where 1 1\n) .replaceAll(\n\n,\n);// where 1 1 格式化调整