我不知道将输入括号与JavaScript匹配。
输入字符串示例:
(pen)
((pen) and orange)
如果输入字符串如下所示,它应该返回false:
(pen
pen)
(pen) and orange)
((pen and orange )
((pen) and orange
)(pen and orange )(
(pen and )orange()
答案 0 :(得分:3)
正则表达式会很混乱。使用简单的计数器更容易。
function parenthesesBalanced(string) {
var count = 0;
for (var i = 0, l = string.length; i < l; i++) {
var char = string.charAt(i);
if (char == "(") {
// Opening parenthesis is always OK
count++;
} else if (char == ")") {
// If we're at the outer level already it's not valid
if (count == 0) return false;
count--;
}
}
return (count == 0);
}
答案 1 :(得分:1)
将parens与正则表达式匹配是一个已知的 hard 问题。虽然有可能,但效率并不高。
只需迭代字符串,维持一个计数器,每次你打开一个paren时递增它,然后每次你接近一个paren时减少它就会快得多。如果计数器低于零,或者字符串末尾的计数器不为零,则表示失败。
答案 2 :(得分:1)
在没有任何团体的情况下取代每一组“左派” - “一些人 - 右派”。如果结果字符串包含括号,则表示不平衡。
balancedParens = function(str) {
var q;
do {
q = str;
str = str.replace(/\([^()]*\)/g, '');
} while(q != str);
return !str.match(/[()]/);
}
a = "foo ((and) bar and (baz) quux) and (blah)";
b = "(dddddd()";
alert(balancedParens(a))
alert(balancedParens(b))
在javascript中无法将平衡字符串与单个正则表达式匹配,因为JS方言不支持递归表达式。
答案 3 :(得分:0)
我创建了一个节点库调用balanced,以使其更加清晰,如果你想获得平衡的外部匹配,你可以做到这一点
balanced.matches({source: source, open: '(', close: ')'})
我的用例有点复杂,要求我做替换和支持评论。