如何在JavaScript中将输入括号与正则表达式匹配?

时间:2010-11-08 09:53:52

标签: javascript

我不知道将输入括号与JavaScript匹配。

输入字符串示例:

(pen)
((pen) and orange)

如果输入字符串如下所示,它应该返回false:

(pen
pen)
(pen) and orange)
((pen and orange )
((pen) and orange 
)(pen and orange )(
(pen and )orange() 

4 个答案:

答案 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))

http://jsfiddle.net/gvGGT/

在javascript中无法将平衡字符串与单个正则表达式匹配,因为JS方言不支持递归表达式。

答案 3 :(得分:0)

我创建了一个节点库调用balanced,以使其更加清晰,如果你想获得平衡的外部匹配,你可以做到这一点

balanced.matches({source: source, open: '(', close: ')'})

我的用例有点复杂,要求我做替换和支持评论。