正则表达式用于识别Java中的两个表达式

正则表达式用于识别Java中的两个表达式,java,regex,Java,Regex,下面有一个字符串形式的表达式: (((status==SUBMITTED) && (submit_date>2020-01-03)) &&(dueDate<(proof_date+1))) ((状态==已提交)和&(提交日期>2020-01-03))和&(截止日期2020-01-03) (截止日期2020-01-03) ((状态==已提交)和&(提交日期>2020-01-03))&(截止日期2020-01-03) 小组结果:(dueDate正则表达式

下面有一个字符串形式的表达式:

(((status==SUBMITTED) && (submit_date>2020-01-03)) &&(dueDate<(proof_date+1)))
((状态==已提交)和&(提交日期>2020-01-03))和&(截止日期2020-01-03)
(截止日期2020-01-03)
((状态==已提交)和&(提交日期>2020-01-03))&(截止日期2020-01-03)

小组结果:(dueDate正则表达式的功能一般不足以解决这个问题。请将其视为试图用花园软管与五级警报地狱搏斗

对于正则表达式,您最希望的是一种能够找到具有特定嵌套级别的括号表达式的模式。例如,识别
((…)(…)
应该是可能的,或者
((…)(…)(…)(…)(…)(…)(…)
。但即使是像
((…)(…)这样看似简单的东西也是可能的
即使不是不可能,也是很困难的

要处理任意表达式,您需要一种比正则表达式更强大的技术。正则表达式在语法的正式层次结构中的下一步就是上下文无关语法(CFGs);它们的功能强大,足以处理任意数量的嵌套结构,彼此之间正确嵌套,并且嵌套到任意深度

但是,对于括号中的表达式,实际上不需要释放CFG解析器的全部功能。您只需要一个堆栈,来跟踪您尚未看到匹配右paren的左paren:

String expression = "((status==SUBMITTED)&&(submit_date>2020-01-03)&&(dueDate<(proof_date+1)))";

Stack<Integer> lpar = new Stack<>();
for (int i = 0; i < expression.length(); ++i) {
    char c = expression.charAt(i);
    if (c == '(') {
        lpar.push(i);
    } else if (c == ')') {
        if (lpar.isEmpty()){
            System.out.println("Unbalanced )");
            break;
        }
        int start = lpar.pop();
        System.out.println(expression.substring(start, i+1));
    }
}
if (!lpar.isEmpty()){
    System.out.println("Missing )");
}


String expression=“((status==submited)&&&(submit_date>2020-01-03)&&&&(duedate)我建议您制作一个解析器(或找到一个已经制作好的)。正则表达式不适用于递归语法。这就像尝试用正则表达式解析HTML一样。谢谢您的回复。
    String expression = "((status==SUBMITTED)&&(submit_date>2020-01-03)&&(dueDate<(proof_date+1)))";

    //Matcher m = Pattern.compile("\\((.*?)\\)").matcher(expression);
    //Matcher m = Pattern.compile("\\([^()]*\\)").matcher(expression);
    Matcher m = Pattern.compile("\\(([^()]*|\\([^()]*|\\))*\\)").matcher(expression);
    while(m.find()) {
        System.out.println("Group Result: "+m.group(0));
    }
Group Result: ((status==SUBMITTED)
Group Result: (submit_date>2020-01-03)
Group Result: (dueDate<(proof_date+1)
String expression = "((status==SUBMITTED)&&(submit_date>2020-01-03)&&(dueDate<(proof_date+1)))";

Stack<Integer> lpar = new Stack<>();
for (int i = 0; i < expression.length(); ++i) {
    char c = expression.charAt(i);
    if (c == '(') {
        lpar.push(i);
    } else if (c == ')') {
        if (lpar.isEmpty()){
            System.out.println("Unbalanced )");
            break;
        }
        int start = lpar.pop();
        System.out.println(expression.substring(start, i+1));
    }
}
if (!lpar.isEmpty()){
    System.out.println("Missing )");
}