Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ${m[0]}`); }); }_Javascript_Regex - Fatal编程技术网

Javascript ${m[0]}`); }); }

Javascript ${m[0]}`); }); },javascript,regex,Javascript,Regex,匹配平衡括号不是一个容易的问题,使用JavaScript更难解决。因为JS正则表达式引擎不允许递归。关于这一点,让我举个例子: 在这种情况下,问题在于如何区分 最后一个结束括号。。。和任何一个内支架。唯一的 最后一个闭合支架和内支架之间的差异为 它们在逻辑上相互关联(即,它们形成一对开/闭)。 这个逻辑不可能通过简单的环顾断言来实现。 然而,他总结道,如果存在已知的需要考虑的最大递归量,这是可能的 这里有一个解决方案,它不使用任何高级正则表达式特性,可以很好地与香草JavaScript配合使用

匹配平衡括号不是一个容易的问题,使用JavaScript更难解决。因为JS正则表达式引擎不允许递归。关于这一点,让我举个例子:

在这种情况下,问题在于如何区分 最后一个结束括号。。。和任何一个内支架。唯一的 最后一个闭合支架和内支架之间的差异为 它们在逻辑上相互关联(即,它们形成一对开/闭)。 这个逻辑不可能通过简单的环顾断言来实现。

然而,他总结道,如果存在已知的需要考虑的最大递归量,这是可能的

这里有一个解决方案,它不使用任何高级正则表达式特性,可以很好地与香草JavaScript配合使用

\((?:\([^()]*?\)|([^()]*\bgreen\b[^()]*)?|[^()])*?\)
解释

  • \(
    匹配左括号
  • (?:…)
    交替的非封顶组
    • \([^()]*?\)
      匹配内圆括号对,使用否定的、非贪婪的
    • ([^()]*\bgreen\b[^()]*)?
      在第1组贪婪中捕获带单词边界的可选单词green
    • [^()]
      一个“修改点”:任何不是保持括号平衡的
      ()
      的东西
  • *?
    关闭非捕获组,匹配零次或多次
  • \)
    匹配)

我使用一个额外的捕获组来满足给定搜索条件的要求;如果没有$1,则完整匹配为垃圾:

示例代码:

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[^()]*)?|[^()])*?\)