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

8

可能重复:
正则表达式能用来匹配嵌套模式吗?

我正在编写一个正则表达式来检查输入字符串是否为正确的算术表达式。问题在于如何检查是否有足够的开放和关闭括号。

表达式:

  1. (1)

  2. (((1)

  3. ((1))))

我认为前瞻和后顾在这里很有用,但目前我只能检查一种。我在使用Java,如果有影响的话。


1
这不是一种常规语言。即使是非常简单的语言,您也需要创建一个解析器。 - eldarerathis
3个回答

9
你不应该使用正则表达式来完成这个任务。相反,你可以逐个字符迭代字符串,并跟踪嵌套级别。
最初的嵌套级别为0。当你看到一个(时,将嵌套级别增加1,当你看到)时,将嵌套级别减少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;
}

谢谢,它工作得很好。不过它不会检测 (),但是因为 OP 正确地请求了正确的括号匹配,所以这不会影响结果。 - wonsuc

4
您需要使用解析器来完成此操作,而不是正则表达式。请参见此问题

只是一个提示,带有条件构造的正则表达式可以做到这一点(.NET或perl):http://weblogs.asp.net/whaggard/archive/2005/02/20/377025.aspx。 - dsummersl

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((”,并且使用此方法将被验证。


1
在打开之前,检查打开是否为0。如果是,则失败检查。这将导致表达式“))34((”或“(a+b))-(34)”失败。 - Riquochet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接