Javascript ${m[0]}`); }); }
匹配平衡括号不是一个容易的问题,使用JavaScript更难解决。因为JS正则表达式引擎不允许递归。关于这一点,让我举个例子: 在这种情况下,问题在于如何区分 最后一个结束括号。。。和任何一个内支架。唯一的 最后一个闭合支架和内支架之间的差异为 它们在逻辑上相互关联(即,它们形成一对开/闭)。 这个逻辑不可能通过简单的环顾断言来实现。 然而,他总结道,如果存在已知的需要考虑的最大递归量,这是可能的 这里有一个解决方案,它不使用任何高级正则表达式特性,可以很好地与香草JavaScript配合使用Javascript ${m[0]}`); }); },javascript,regex,Javascript,Regex,匹配平衡括号不是一个容易的问题,使用JavaScript更难解决。因为JS正则表达式引擎不允许递归。关于这一点,让我举个例子: 在这种情况下,问题在于如何区分 最后一个结束括号。。。和任何一个内支架。唯一的 最后一个闭合支架和内支架之间的差异为 它们在逻辑上相互关联(即,它们形成一对开/闭)。 这个逻辑不可能通过简单的环顾断言来实现。 然而,他总结道,如果存在已知的需要考虑的最大递归量,这是可能的 这里有一个解决方案,它不使用任何高级正则表达式特性,可以很好地与香草JavaScript配合使用
\((?:\([^()]*?\)|([^()]*\bgreen\b[^()]*)?|[^()])*?\)
解释
匹配左括号\(
有交替的非封顶组:(?:…)
匹配内圆括号对,使用否定的、非贪婪的\([^()]*?\)
在第1组贪婪中捕获带单词边界的可选单词green([^()]*\bgreen\b[^()]*)?
一个“修改点”:任何不是保持括号平衡的[^()]
的东西()
关闭非捕获组,匹配零次或多次*?
匹配)\)
const regex=/\((?:\([^()]*?\)|([^()]*\bgreen\b[^()]*)?[^()])*?\)/gm;
const str=`osdfhosjdjakjdnvkjndkfvjelkrjjrijrvrvrjvnkrjvnkn(薄荷(浅)绿色裤子)shdbfhsbdhffbjd(沙发)hvbshdbvjhsbdfjs(森林(深色)(染色)绿色衬衫)sjfjsdhfjshkd(绿色桌子)(绿色)`;
让m;
while((m=regex.exec(str))!==null){
//这是避免具有零宽度匹配的无限循环所必需的
if(m.index==regex.lastIndex){
regex.lastIndex++;
}
//可以通过'm`-变量访问结果。
m、 forEach((匹配,组索引)=>{
if(匹配和组索引===1)
log(`Found${m[0]}`);
});
}
JS中RexExp的一个惊人资源是您希望括号平衡还是(森林(绿色衬衫)
仍然有效?我希望括号平衡,是的。JS中RexExp的惊人资源是您希望括号平衡还是(森林(绿色衬衫)
仍然有效?我希望括号是平衡的,是的。这似乎也会返回括号?值在捕获组1中。这将不包含括号。当我测试这一点时,括号在结果中?(尽管正如我向DanielBeck提到的,我不明白为什么。)您可以选中此项查看右侧的捕获组。啊,我明白了。只需调用str.match()
我得到的是完全匹配,而不是捕获参数中捕获到的内容。这似乎也返回了括号?值在捕获组1中。这将不包含括号。当我测试时,参数出现在结果中?(虽然我向DanielBeck提到过,我不明白为什么。)您可以查看右侧的捕获组。啊,我明白了。只需调用str.match()
我就得到了完整的匹配,而不是捕获组中捕获的内容。
\((?:\([^()]*?\)|([^()]*\bgreen\b[^()]*)?|[^()])*?\)