0

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

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

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

4

5 回答 5

3

两件事情:

  1. 您通过 anchor 将表达式绑定到字符串的开头^,因此它只会匹配字符串开头的左括号(并且在找到另一个右括号时会失败。)

  2. 如果您的括号是嵌套的,那么 JavaScript 正则表达式是不可能的。 (如果它们没有嵌套,则可以这样做)

于 2013-06-20T13:36:10.740 回答
1

根据这个答案,您无法确定括号是否仅通过正则表达式匹配。那里有其他答案,它们以各种其他方式解决问题(即不完全依赖正则表达式)。

于 2013-06-20T13:51:43.063 回答
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
于 2013-06-20T14:15:56.250 回答
1

这是使用正则表达式(和嵌套括号问题)的替代方法,类似于@ kmoerman的这个答案,但该函数返回trueorfalse并采用可选参数,因此您可以测试 say{}

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 上

更新:也类似于@Jon在评论中指出的@Damask这个答案

于 2013-06-20T14:38:06.280 回答
0

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

\([^\)]*$

那将查找“(”的任何实例,它与文件/行的末尾之间没有“)”。因此,如果返回 true,您可以将用户指向匹配的索引。如果您的括号格式不支持嵌套(正如stema所说,如果您尝试仅使用正则表达式处理它,则不应该),那么您可以对开括号执行类似的操作。我会把它放在我的示例中,但由于某种原因,“EOF(”的语法在 regexpal.com 上让我记不住......)

于 2013-06-20T13:40:11.747 回答