正则表达式挑战:匹配指数级深度的嵌套括号
解决深度嵌套括号的最深层内容匹配问题
你的现有正则/\(([^()]+)\)/只能匹配最内层的单个括号对,默认只返回第一个匹配结果(示例中的(A))。要提取嵌套层数最深的内容(比如示例中的C),可以用以下两种方案:
方案一:提取所有最内层内容后筛选最深项
这种方法兼容所有JS环境,核心思路是先捕获所有最内层括号的内容,再统计每个内容对应的嵌套层数,最终筛选出层数最多的项。
const regex = /\(([^()]+)\)/g; const text = "(((A))) (((((B))))) (((((((C)))))))"; const matchInfos = []; let currentMatch; // 遍历所有最内层括号匹配项,记录内容和对应嵌套深度 while ((currentMatch = regex.exec(text)) !== null) { // 计算当前匹配项左侧的左括号数量,加1得到总嵌套层数 const leftBracketCount = text.slice(0, currentMatch.index).split('(').length - 1; matchInfos.push({ content: currentMatch[1], depth: leftBracketCount + 1 }); } // 找到深度最大的内容 const deepestContent = matchInfos.reduce((maxItem, currItem) => currItem.depth > maxItem.depth ? currItem : maxItem, matchInfos[0] ).content; console.log(deepestContent); // 输出:C
方案二:用递归正则匹配完整最深嵌套结构(ES2018+)
如果你的运行环境支持ES2018及以上的递归正则特性,可以直接匹配完整的嵌套括号结构,再从中提取最深层内容:
// 匹配任意深度的完整嵌套括号结构 const nestedRegex = /\((?:[^()]|(?R))+\)/g; const text = "(((A))) (((((B))))) (((((((C)))))))"; let longestMatch = ''; let currentMatch; // 找出最长的嵌套结构(即层数最深的) while ((currentMatch = nestedRegex.exec(text)) !== null) { if (currentMatch[0].length > longestMatch.length) { longestMatch = currentMatch[0]; } } // 提取最深嵌套结构中的核心内容 const content = longestMatch.match(/\(([^()]+)\)/)[1]; console.log(content); // 输出:C
关键说明
- 传统正则不支持直接匹配任意深度的嵌套,但可以通过匹配最内层无括号的括号对间接处理,因为无论外层嵌套多少层,最内层的结构都是
(内容)且内容不含括号。 - 方案一适配所有环境,方案二依赖ES2018的递归正则特性(现代浏览器、Node.js 10+均支持)。
内容的提问来源于stack exchange,提问作者prabu naresh
相关产品推荐
相关产品推荐

