想写一个匹配不定层数(就是括号嵌套括号的层数不定)括号的js正则表达式,
如:12*(12+(12-(12*4))) 正确的
(12+(1-1))*(1*(1+1)) 正确的就是要验证数学算式中括号是否成对 (1+1)*(1+1))错误的 ((1+1)*(1+1) 错误的
如:12*(12+(12-(12*4))) 正确的
(12+(1-1))*(1*(1+1)) 正确的就是要验证数学算式中括号是否成对 (1+1)*(1+1))错误的 ((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);
与其外加函数P,还不如这样简单:var s = "(1+1)*(1+1))";var i = 0;s.replace(/\(|\)/g, function($){$ == "(" ? i++ : i--});alert(!i)应该有很好的正则的
例如这种情况:
var s = "1+1)*((1+1)";
嗯,有道理,看来只能递归了。刚才看到回复,那就写个字符串中()、[]、{}、()、【】、{}、""、''、“”、‘’符号成对闭合的检测方法吧。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("("));
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("("));
alert( str1.split('(').length == str1.split(')').length );
修正以上变量 “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("『", "『』"));
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
}