正则表达式找到不完整的圆括号

时间:2013-06-20 13:26:55

标签: javascript regex

我需要一个可以检测不完整圆括号的正则表达式。 我试过这个。 /^(?:(?!\(.*\)))/ 我的测试字符串是(sample,然后这个正则表达式检测到不完整的括号,即返回结果true。但是,如果我的测试字符串是(sample) (another。然后它返回false。

我必须找到一个否定的模式,因为如果我试图寻找简单的/\(*\)/,那么它将检测第一个完整的括号并返回。现在即使在尝试消极前瞻之后,它仍然失败了。请帮我告诉我哪里出错了。

P.S。好吧,测试字符串太愚蠢了。这就是我实际想要实现的目标。用户将输入自然查询,如((A和B)或(C和D))或E.这将用于对一组规则进行分组。

5 个答案:

答案 0 :(得分:3)

两件事:

  1. 您通过锚^将表达式绑定到字符串的开头,因此它只匹配字符串开头的左括号(当它找到另一个结束括号时将失败) 。)

  2. 如果您的括号是嵌套的,则无法使用JavaScript正则表达式。 (如果它们没有嵌套,则可以完成)

    < / LI>

答案 1 :(得分:1)

根据this answer,您无法确定括号是否仅通过正则表达式匹配。其他答案可以用其他各种方式解决问题(即不依赖于正则表达式)。

答案 2 :(得分:1)

正如其他已经提到的答案,javascript中无法使用递归正则表达式。这是一个函数,如果字符串具有正确配对的括号,则返回true,或者出现问题的字符索引。

var nested_brackets = function (test) {
    var left = '(', right = ')';
    var i = 0, n = test.length, tally = 0;
    while (i < n) {
        if (test[i] == left) ++tally;
        else if (test[i] == right) --tally;
        if (tally < 0) break;
        ++i;
    }

    return (i == n && tally == 0) || i;
}

一些例子

nested_brackets("(A and (B or C))"); // returns true
nested_brackets("(A) and (B)");      // returns true
nested_brackets("(A and (B or C)");  // returns 15
nested_brackets("(A and B)) or C)"); // returns 9

答案 3 :(得分:1)

以下是使用@ similar to this answer的正则表达式(和嵌套括号问题),kmoerman的替代方法,但该函数返回truefalse并且需要可选参数,以便您可以测试说{}

的Javascript

function testParenthesisPairs(string /*, openChar, closeChar */ ) {
    var length = string.length,
        i = 0,
        count = 0,
        openChar = arguments[1] || "(",
        closeChar = arguments[2] || ")";

    while (i < length) {
        char = string.charAt(i);

        if (char === openChar) {
            count += 1;
        } else if (char === closeChar) {
            count -= 1;
        }

        if (count < 0) {
            return false;
        }

        i += 1;
    }

    return count === 0;
}

console.log(testParenthesisPairs("()()()()"));
console.log(testParenthesisPairs("()()()()", "(", ")"));
console.log(testParenthesisPairs("()()()("));
console.log(testParenthesisPairs(")()()()"));
console.log(testParenthesisPairs(")(()()()"));

输出

真 真正 假 假 假的

jsfiddle

更新:与@ this answer中的Damask类似,正如评论中@ Jon指出的那样。

答案 4 :(得分:0)

这可能是一个随意的答案,我认为这可能取决于预期的输入类型......

\([^\)]*$

那个人会在它和文件/行的末尾之间寻找“(”,它没有“)”的任何实例。因此,如果返回true,则可以将用户指向匹配的索引。如果你的括号格式不支持嵌套(正如stema所说,如果你试图用正则表达式处理它,它应该)那么你可以做一些类似的开放式括号。我会把它放在我的样本中,但出于某种原因,“EOF (”的语法在regexpal.com上失败了我的记忆......)