正则表达式检查括号是否平衡

时间:2010-10-12 20:22:13

标签: java regex

  

可能重复:
  Can regular expressions be used to match nested patterns?

我正在编写一个regexp来检查输入字符串是否是正确的算术表达式。问题是检查是否有足够的开括号和右括号。

表达式:

  1. (1)

  2. (((1)

  3. ((1))))

  4. 我认为前瞻和后视在这里很有用但是现在我只能检查一种。如果重要的话,我正在使用Java。

3 个答案:

答案 0 :(得分:9)

您不应该使用正则表达式来执行此操作。相反,您可以逐个字符地迭代字符串并跟踪嵌套级别。

最初嵌套为0.当您看到(将嵌套增加1时,以及当您看到)减少嵌套时。如果最终嵌套为0且嵌套永远不会低于0,则表达式会正确平衡。

public static boolean checkParentheses(String s) {
    int nesting = 0;
    for (int i = 0; i < s.length(); ++i)
    {
        char c = s.charAt(i);
        switch (c) {
            case '(':
                nesting++;
                break;
            case ')':
                nesting--;
                if (nesting < 0) {
                    return false;
                }
                break;
        }
    }
    return nesting == 0;
}

答案 1 :(得分:4)

您需要使用解析器来执行此操作,而不是正则表达式。请参阅this question

答案 2 :(得分:0)

为什么不算这样的开幕式和闭幕式呢?

String expression = "((1+x) - 3 * 4(6*9(12+1)(4+(2*3+(4-4)))))";

int open = 0;
for(int x = 0; x < open; x++){
   if(expression[x] == '(')
      open++;
   else if(expression[x] == ')')
      open--;
}
if (open != 0)
   // Not a valid expression

当然这只会检查你是否有合适的金额 - 有人可以写'))3 * 4(('并且它将使用这种方法验证。