如何检查开括号的数量是否等于闭括号的数量?

时间:2012-12-19 10:51:51

标签: javascript regex

如何检查开括号的数量是否等于使用正则表达式的闭括号数?

以下是代码:

var expression1 = "count(machineId)+count(toolId)";
var expression2 = "count(machineId)+count(toolId))";

这是2个表达式,其中expression1中括号的数量等于括号的数量,而在expression2中,左括号的数量不等于关闭的数量括号。我需要一个正则表达式,它计算开括号和小括号的数量,并给我提醒。我也需要检查有效的语法。

if(expression1.......){ // here goes the regular expression
    alert("Matched");
}
else{
    alert("Not matched");
}

9 个答案:

答案 0 :(得分:59)

var expression1 = "count(machineId)+count(toolId)";
var expression2 = "count(machineId)+count(toolId))";

if (matches(expression1)) {
    alert("Matched"); // Triggered!
}
else {
    alert("Not matched");
}

if (matches(expression2)) {
    alert("Matched");
}
else {
    alert("Not matched"); // Triggered!
}

function matches(str) {
    try {
        new Function(str);
        return true;
    }
    catch (e) {
        return !(e instanceof SyntaxError);
    }
}

这是有效的,因为如果您的代码错误,new Function()会导致语法错误。捕获错误意味着您可以安全地处理它并做任何您想做的事情。另一个好处是它不执行代码,只是解析它。基本上,您正在将您的任务用于浏览器的解析器。

它不使用正则表达式,但会检查您的代码是否有效。因此,它会告诉您括号是否匹配。

答案 1 :(得分:12)

任务可以简单地在没有正则表达式的情况下解决,只需计算括号。

var a = 'count(machineId)+count())toolId)'
var braces = 0;
for (var i=0, len=a.length; i<len; ++i) {
   switch(a[i]) {
       case '(' : 
          ++braces;
          break;
       case ')' : 
           --braces;
           break;
   }
   if (braces < 0) {    
      alert('error');
      break;
   }
}

if (braces)
    alert('error');

答案 2 :(得分:5)

如果您的目标是检查表达式是否有效(这也意味着它的子字符串只包含括号形成正确的括号序列),那么正则表达式对您没有帮助。

正则表达式只能处理所谓的“regular languages”(虽然JS regexps可能比它们的理论对应物更强大,但这种能力的代价更复杂),而正确的括号序列的语言不规则。

查看那些slides - 它们可以让您了解正则表达式无法识别正确的括号序列的原因。

然而,问题并不那么难。你应该只保持一个堆栈并从左到右翻过你的字符串。每当你遇到一个开口支架,你就把它推到堆叠上。当你遇到一个结束括号时,你弹出堆栈的顶部元素并检查它的类型是否与你的类型匹配(是的,这个算法可以处理多种类型的括号)。最后你应该检查堆栈是否为空。

如果您不需要处理不同类型的括号(例如,您只有'('和')'),您可以只维护变量openBrackets(基本上它代表堆栈的大小)不要让它变成消极的。

答案 3 :(得分:4)

if (expression1.match(/\(/g).length === expression2.match(/\)/g).length) {
    // is equal
}

为了使其适用于不包含大括号的字符串,您可以使用以下解决方法:

((expression1.match(/\(/g) || []).length

答案 4 :(得分:3)

这是另一种方法:

function validParenNesting(text) {
    var re = /\([^()]*\)/g; // Match innermost matching pair.
    // Strip out matching pairs from the inside out.
    while (text.match(re))
        text = text.replace(re, '');
    // If there are any parens left then no good
    if (text.match(/[()]/))
        return false;
    // Otherwise all parens part of matching pair.
    return true;
}

答案 5 :(得分:2)

如果您只关心计数,为什么不尝试这样的事情。

if(expression1.split('(').length == expression1.split(')').length) {
  alert('matched');
}

答案 6 :(得分:0)

  
      
  1. “我需要使用正则表达式匹配等于没有近括号的开括号”

  2.   
  3. “我也需要检查有效的语法。”

  4.   

如果 2 为真,那么 1 也是如此。因此,请查找您知道的有效语法匹配 - 在这种情况下: {} 。执行一个循环,从“堆栈”中删除所有有效匹配,直到没有有效匹配为止。如果最后留下的是什么,那么这意味着你的论证是100%有效的。如果最后剩下的是某事 - 这意味着“剩余部分”没有通过你的有效性测试,因此无效:

var foo = function(str) {
    while(str.match(/{}/g))           // loop while matches of "{}" are found
        str = str.replace(/{}/g, ''); // "slices" matches out of the "stack"
    return !str.match(/({|})/g);      // `false` if invalids remain, otherwise `true`
};

foo('{{{}}}'); // true
foo('{{}}}}}}}}}}{}'); // false

答案 7 :(得分:0)

尝试......

function matchBraces(s) {
  return s.match(/\(/g).length === s.match(/\)/g).length;
}

...然后,您的警报代码如下......

if(matchBraces(expression1)) {
    alert("Matched");
} else {
   alert("Not matched");
}

工作副本: jsFiddle

答案 8 :(得分:0)

以下内容可用于查找括号的数量。 但是,它不使用RegExp并使用简单的逻辑。

var l = 0;
var r = 0;
//Count the number of brackets.
for(var i=0;i<str.length;i++){
  if(str[i]=="("){
    l++;
  }
  else if(str[i]==")"){
    r++;
  }
}
if(l==r){ //The number of opening and closing brackets are equal.
  doSomething();
}