用于平衡parantheses的Java正则表达式

时间:2017-07-11 08:04:05

标签: java regex

我有一个字符串:

If ({{SQL}}.Employee.Title starts with 'Production') 
and  (substring of {{SQL}}.Employee.Title from '27' for '2' is not '30') 
and ({{SQL}}.Employee.HireDate is greater than or equal to '2000-01-01 00:00:00.000')  
then Pull  {{SQL}}.Title,  {{SQL}}.HireDate from Employee

从这个表达式中,我想知道圆形括号是否在Java语言中是否正确平衡。

一种方法是创建一个计数器变量,一旦找到开括号就会递增,当遇到闭括号时递减它。根据结果​​,我可以决定结果。

但这对于字符串like()没有帮助,即括号之间没有任何字母数字字符。

有什么方法可以确定圆括号是否平衡,并且这些括号之间应该有字母数字字符。 如果括号为空,即开括号和右括号之间没有字符,则应该抛出错误。

1 个答案:

答案 0 :(得分:1)

您需要一个类似于下面的代码。它确实使用堆栈来跟踪打开/关闭的parantheses的数量+记住最后一个char出现的是为了跟踪空的parantheses:

    String test = "{TEST}(A){";

    Stack<Integer> stack = new Stack<>();
    boolean lastCharIsParantheses = false;
    for (char c : test.toCharArray()) {
        switch (c) {
            case '{':
            case '(': {
                stack.push(1);
                lastCharIsParantheses = true;
                continue;
            }
            case '}':
            case ')':
                stack.pop();
                if (lastCharIsParantheses) {
                    throw new RuntimeException("Empty parantheses");
                }
        }
        lastCharIsParantheses = false;
    }
    if (!stack.empty()) {
        throw new RuntimeException("Not matching number of opened/closed parantheses");
    }