想写一个匹配不定层数(就是括号嵌套括号的层数不定)括号的js正则表达式,
如:12*(12+(12-(12*4))) 正确的
    
    (12+(1-1))*(1*(1+1)) 正确的就是要验证数学算式中括号是否成对 (1+1)*(1+1))错误的 ((1+1)*(1+1) 错误的

解决方案 »

  1.   

    var s = "(1+1)*(1+1))";
    var p = function() {
        s = s.replace(/\([^)(]*\)/g,"");
        if((/\(.*\)/g).test(s)){
            p();
        }
    }
    p();
    s = (/[()]/g).test(s) ? "false" : "true";
    alert(s);
      

  2.   

    return upsider:
    与其外加函数P,还不如这样简单:var s = "(1+1)*(1+1))";var i = 0;s.replace(/\(|\)/g, function($){$ == "(" ? i++ : i--});alert(!i)应该有很好的正则的
      

  3.   

    再来一个更简单的:var s = "12*(12+(12-(12*4))))";alert(s.split(/\(|\)/).length & 1 ? "正确的" : "错误的")
      

  4.   

    是一种思路  不过不是很严谨
    例如这种情况:
    var s = "1+1)*((1+1)";
      

  5.   


    嗯,有道理,看来只能递归了。刚才看到回复,那就写个字符串中()、[]、{}、()、【】、{}、""、''、“”、‘’符号成对闭合的检测方法吧。var str1 = "12*(12+(12-(12*4)))";
    var str2 = "(12+(1-1))*(1*(1+1))";
    var str3 = "(1+1)*(1+1))";
    var str4 = "((1+1)*(1+1)";
    var str5 = "1+1)*((1+1";String.prototype.symbolDoubler = function(sx) {
        var OL = {}, OR = {}, so = "()[]{}()【】{}\"\"''“”‘’";
        so.replace(/(.)(.)/g, function($1, $2, $3){OL[$2] = $3; OR[$3] = $2});
        var sx = /[\(\[\{(【{“‘]/.test(sx) ? sx : OR[sx];
        var sy = /[\(\[\{(【{“‘]/.test(sx) ? OL[sx] : sx;
        var rc = new RegExp("[\\"+sx+"\\"+sy+"]");
        var re = new RegExp("\\"+sx+"[^\\"+sx+"\\"+sy+"]*\\"+sy);
        return rc.test(function(str) {
            return re.test(str) ? arguments.callee(str.replace(re, "")) : str
        }(this)) ? false : true
    }alert(str1.symbolDoubler("("));
    alert(str2.symbolDoubler(")"));
    alert(str3.symbolDoubler("("));
    alert(str4.symbolDoubler(")"));
    alert(str5.symbolDoubler("("));
      

  6.   

    去掉一个变量“rc”感觉舒服些var str1 = "12*(12+(12-(12*4)))";
    var str2 = "(12+(1-1))*(1*(1+1))";
    var str3 = "(1+1)*(1+1))";
    var str4 = "((1+1)*(1+1)";
    var str5 = "1+1)*((1+1";String.prototype.symbolDoubler = function(sx) {
           var OL = {}, OR = {}, so = "()[]{}()【】{}\"\"''“”‘’";
           so.replace(/(.)(.)/g, function($1, $2, $3){OL[$2] = $3; OR[$3] = $2});
           var sx = /[\(\[\{(【{“‘]/.test(sx) ? sx : OR[sx];
           var sy = /[\(\[\{(【{“‘]/.test(sx) ? OL[sx] : sx;
           var re = new RegExp("\\"+sx+"[^\\"+sx+"\\"+sy+"]*\\"+sy);
           return new RegExp("[\\"+sx+"\\"+sy+"]").test(function(str) {
                  return re.test(str) ? arguments.callee(str.replace(re, "")) : str
           }(this)) ? false : true
    }alert(str1.symbolDoubler("("));
    alert(str2.symbolDoubler(")"));
    alert(str3.symbolDoubler("("));
    alert(str4.symbolDoubler(")"));
    alert(str5.symbolDoubler("("));
      

  7.   

    var str1 = "12*(12+(12-(12*4)))";
    alert( str1.split('(').length == str1.split(')').length );
      

  8.   


    修正以上变量 “sx”命名错误,并扩展(THRO自定义白名单参数)闭合检测范围到所有(符号、字母、数值、中英文)字符:var str1 = "12*(12+(12-(12*4)))";
    var str2 = "(12+(1-1))*(1*(1+1))";
    var str3 = "(1+1)*(1+1))";
    var str4 = "((1+1)*(1+1)";
    var str5 = "1+1)*((1+1";
    var str6 = "『1+1』*『1+1』";
    var str7 = "「1+1」*「1+1」";
    var str8 = "『12+『1-1』』*『1*『1+1』』』";String.prototype.symbolDoubler = function(sym, add) {
           var so = st = sx = sy = "", re = null, oL = {}, oR = {};
           so = "()[]{}()【】{}\"\"''“”‘’" + [add && !(add.length & 1) && add || ""];
           if(so.indexOf(sym)<0){return "该符号没有缺省设置,\n请成对添加到第二参数白名单!\n\n"}
           so.replace(/(.)(.)/g, function($1, $2, $3){oL[$2] = $3; oR[$3] = $2; st += $2});
           sx = st.indexOf(sym) < 0 ? oR[sym] : sym;
           sy = sx == sym ? oL[sym] : sym;
           re = new RegExp("\\"+sx+"[^\\"+sx+"\\"+sy+"]*\\"+sy);
           return new RegExp("[\\"+sx+"\\"+sy+"]").test(function(str) {
                  return re.test(str) ? arguments.callee(str.replace(re,"")) : str
           }(this)) ? false : true
    }alert(str1.symbolDoubler(")"));
    alert(str2.symbolDoubler(")"));
    alert(str3.symbolDoubler("("));
    alert(str4.symbolDoubler(")"));
    alert(str5.symbolDoubler(")"));
    alert(str6.symbolDoubler("『"));
    alert(str7.symbolDoubler("」", "「」"));
    alert(str8.symbolDoubler("『", "『』"));
      

  9.   


    String.prototype.symbolDoubler = function(sym, add) {
           var so = st = sx = sy = "", re = null, oL = {}, oR = {};
           so = "()[]{}()【】{}\"\"''“”‘’" + [add && !(add.length & 1) && add || ""];
           if(so.indexOf(sym)<0){return "该符号没有缺省设置,\n请成对添加到第二参数白名单!\n\n"}
           so.replace(/(.)(.)/g, function($1, $2, $3){oL[$2] = $3; oR[$3] = $2; st += $2});
           st.indexOf(sym) < 0 ? (sx = oR[sym], sy = sym) : (sx = sym, sy = oL[sym]);
           re = new RegExp("\\"+sx+"[^\\"+sx+"\\"+sy+"]*\\"+sy);
           return new RegExp("[\\"+sx+"\\"+sy+"]").test(function(str) {
                  return re.test(str) ? arguments.callee(str.replace(re,"")) : str
           }(this)) ? false : true
    }