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

Javascript 正则表达式查找不完整的圆括号,javascript,regex,Javascript,Regex,我需要一个正则表达式,可以检测不完整的圆括号。 我试过这个/^(?:(?!\(.*))/ 我的测试字符串是this(sample),然后该正则表达式检测不完整的括号,即返回resulttrue。但是,如果我的测试字符串是this(sample)(另一个),则返回false 我必须找到一个否定的模式,因为如果我试图寻找简单的/\(*\)/,那么它将检测到第一个完整的括号并返回。现在,即使尝试了否定的前瞻,它也失败了。请帮助我,我哪里出了问题 好的,那个测试字符串太蠢了。这是我实际想要实现的。用户将

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

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

好的,那个测试字符串太蠢了。这是我实际想要实现的。用户将输入一个自然查询,如((a和B)或(C和D))或E。这将用于对规则集进行分组。

两件事:

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

  • 如果括号是嵌套的,则不可能使用JavaScript正则表达式。(如果括号不是嵌套的,则可以这样做)

  • 两件事:

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

  • 如果括号是嵌套的,则不可能使用JavaScript正则表达式。(如果括号不是嵌套的,则可以这样做)


  • 这可能是一个随便的回答,我认为这可能取决于预期的输入类型

    \([^\)]*$
    

    它将查找任何一个“(”,在它和文件/行结尾之间没有“)”的实例。因此,如果返回true,您可以将用户指向匹配的索引。如果您的括号格式不支持嵌套(正如stema所说,如果您仅用正则表达式处理它,则不应该这样做)然后你可以对开括号做一些类似的事情。我会把它放在我的示例中,但出于某种原因,“EOF”或(“在regexpal.com上内存不足…)

    这可能是一个即兴回答,我想这可能取决于预期的输入类型

    \([^\)]*$
    

    它将查找任何一个“(”,在它和文件/行结尾之间没有“)”的实例。因此,如果返回true,您可以将用户指向匹配的索引。如果您的括号格式不支持嵌套(正如stema所说,如果您仅用正则表达式处理它,则不应该这样做)然后你可以对开括号做类似的事情。我会把它放在我的示例中,但出于某种原因,“EOF”或(“was failing my memory on regexpal.com…)的语法

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

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

    正如前面提到的其他答案一样,递归正则表达式在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;
    }
    

    正如前面提到的其他答案一样,递归正则表达式在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;
    }
    

    这里有一个使用正则表达式(和嵌套括号问题)的替代方法,方法是@,但函数返回
    true
    false
    ,并接受可选参数,以便您可以测试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(")(()()()"));
    
    函数test括号ispairs(string/*、openChar、closeChar*/){
    var length=string.length,
    i=0,
    计数=0,
    openChar=参数[1]| |“(“,
    closeChar=参数[2]| |“)”;
    while(i
    输出

    真的 真的 假的 假的 假的


    更新:也类似于注释中由@指出的由@。

    这里有一个替代使用正则表达式(和嵌套括号问题)的方法,由@,但函数返回
    true
    false
    ,并接受可选参数,以便您可以测试
    {

    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(")(()()()"));
    
    函数test括号ispairs(string/*、openChar、closeChar*/){
    var length=string.length,
    i=0,
    计数=0,
    openChar=参数[1]| |“(“,
    closeChar=参数[2]| |“)”;
    while(i