获取所有内部括号/圆括号

3

我正在处理JavaScript中一个字符串的所有内部括号。

例如,如果我有这样一个字符串(不要担心%符号,Qx值用其括起来)

((!%Q1% || %Q2%) || ((%Q3% && %Q4%) || (%Q5% && %Q6%)))

I would like to get in my result:

(!%Q1% || %Q2%) || ((%Q3% && %Q4%) || (%Q5% && %Q6%))
(!%Q1% || %Q2%) 
(%Q3% && %Q4%) || (%Q5% && %Q6%)
(%Q3% && %Q4%)
(%Q5% && %Q6%)

基本上,我正在寻找一种通用的方法,不仅仅是上面的例子。我曾尝试在循环中使用类似于这样的内容,但只适用于更简单的例子(带有较少的括号)。

init = condition.indexOf('(');
fin = condition.lastIndexOf(')');
inner = condition.substr(init+1,fin-init-1);

我希望使用仅JS的解决方案,但其他解决方案也可以考虑。

2
使用或编写解析器。JS正则表达式无法胜任。 - HamZa
1
说到解析器:http://pegjs.org/ 或 https://zaach.github.io/jison/ - Shanoor
1个回答

2
您可以使用以下代码,来自Sean在JavaScript中匹配嵌套结构,第二部分博客的评论,只需在匹配结尾添加(),因为它们将被剥离:

function matchRecursiveRegExp (str, left, right, flags) {
 var str_copy = str,
 f = flags || "",
 g = f.indexOf("g") > -1,
 x = new RegExp(left + "|" + right, "g" + f.replace(/g/g, "")),
 l = new RegExp(left, f.replace(/g/g, "")),
 a = [],
 b = [],
 keep_going, t, s, m;
 do {
   t = 0;
   keep_going = false;
   while (m = x.exec(str_copy))
   {
     if (l.test(m[0])) {
       if (!t++) {
         s = x.lastIndex;
       } else {
         //another start has occurred, save that off
         b.push(m.index);
       }
     } else if (t) {
        if (!--t) {
          a.push(str_copy.slice(s, m.index));
          //found the end match
          if (!g) return a;
        }
     }
   }
   if (g && b.length) {
   //nested matches found
   //slice the string with the index that was
   //saved and keep going
     str_copy = str_copy.slice(b.shift());
     keep_going = true;
   }
}
 while (keep_going || (t && (x.lastIndex = s)));
 return a;
}

var str = '((!%Q1% || %Q2%) || ((%Q3% && %Q4%) || (%Q5% && %Q6%)))';
var res = matchRecursiveRegExp(str, '\\(', '\\)', 'g');
for (var i = 0; i<res.length; i++)
  document.body.innerHTML += "(" + res[i] + ")" + "<br/>";


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接