如何检查开括号的数量是否等于使用正则表达式的闭括号数?
以下是代码:
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");
}
答案 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)
“我需要使用正则表达式匹配等于没有近括号的开括号”
- 醇>
“我也需要检查有效的语法。”
如果 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();
}