gpt4 book ai didi

java - 正则表达式识别Java中括号之间的表达式

转载 作者:行者123 更新时间:2023-12-04 08:46:02 25 4
gpt4 key购买 nike

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

(((status==SUBMITTED) && (submit_date>2020-01-03)) &&(dueDate<(proof_date+1)))
我想识别上述字符串中的所有内部表达式,如下所示:
(status==SUBMITTED)
(submit_date>2020-01-03)
(dueDate<(proof_date+1)

((status==SUBMITTED) && (submit_date>2020-01-03))
((status==SUBMITTED) && (submit_date>2020-01-03)) &&(dueDate<(proof_date+1))
下面是我用Java编写的代码:
    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)
我怎样才能获得上述所有组合。是否有可以正确识别这一点的正则表达式?

最佳答案

一般而言,正则表达式不足以解决这个问题。把它想象成试图用花园水管对抗五级警报。
您对正则表达式的最佳期望是一种可以找到具有特定嵌套级别的带括号的表达式的模式。例如,识别 ((...)...(...))应该是可以的,或者(((...)...(...))..((...)..(...))) .但即使是像 (((...)..(...))...(...)) 这样看似简单的事情如果不是不可能的话,这将是困难的。
要处理任意表达式,您需要比正则表达式更强大的技术。语法正式层次结构中正则表达式的下一步被称为 上下文无关文法 (CFG);它们足够强大,可以处理任意数量类型的嵌套结构,正确地相互嵌套,并嵌套到任意深度。
但是,对于括号内的表达式,您实际上并不需要发挥 CFG 解析器的全部功能。您所需要的只是一个堆栈,以跟踪您尚未看到匹配的右括号的左括号:

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 )");
}

关于java - 正则表达式识别Java中括号之间的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64316328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com