gpt4 book ai didi

java - 模式匹配通过排除最后一个来提取大括号

转载 作者:行者123 更新时间:2023-11-30 06:32:38 26 4
gpt4 key购买 nike

我正在尝试从下面提到的表达式中提取字符

private static final String FILTER_X = "userid=UUID.randomUUID();empid=lkjdlfd ;eventType=Usage"
+ ";classid=1" + ";fromDate=2017-08-11Z10:00:00+1:00" + ";toDate=2017-09-11Z10:00:00+1:00"
+ ";(classno=10 or(classno<4 and joiningDate>=2017-08-11Z10:00:00+1:00));"
+ "(classno=10 or(classno<10 and joiningDate>=2017-08-11Z10:00:00+1:00))";

StringTokenizer tokens = new StringTokenizer(FILTER_X, ";");
while (tokens.hasMoreTokens()) {
String token = tokens.nextToken();
System.out.println(token);
Pattern p1 = Pattern.compile("\\((.*?)\\)");
Matcher m1 = p1.matcher(token);
while (m1.find()) {
System.out.println(m1.group(1));
}
}

输出:

> > userid=UUID.randomUUID()
> >
> > empid=lkjdlfd eventType=Usage classid=1
> > fromDate=2017-08-11Z10:00:00+1:00 toDate=2017-09-11Z10:00:00+1:00
> > (classno=10 or(classno<4 and joiningDate>=2017-08-11Z10:00:00+1:00))
> > classno=10 or(classno<4 and joiningDate>=2017-08-11Z10:00:00+1:00
> > (classno=10 or(classno<10 and joiningDate>=2017-08-11Z10:00:00+1:00))
> > classno=10 or(classno<10 and joiningDate>=2017-08-11Z10:00:00+1:00

我正在尝试过滤以大括号开头的字符串。对于上面的模式,它打印大括号内的字符串但它没有打印最后一个大括号,我期望输出为

(classno=10 or(classno<4 and joiningDate>=2017-08-11Z10:00:00+1:00))

这意味着它应该单独跳过最后一个大括号。谁能告诉我这个模式有什么问题吗?

最佳答案

您在正则表达式中使用了惰性量词。这导致正则表达式引擎停止匹配 () 之间的最短匹配。

您可以使正则表达式变得懒惰,并避免捕获组,因为您的预期结果是 () 之间完全匹配。

final static String FILTER_X = "userid=UUID.randomUUID();empid=lkjdlfd ;eventType=Usage"
+ ";classid=1" + ";fromDate=2017-08-11Z10:00:00+1:00" + ";toDate=2017-09-11Z10:00:00+1:00"
+ ";(classno=10 or(classno<4 and joiningDate>=2017-08-11Z10:00:00+1:00));"
+ "(classno=10 or(classno<10 and joiningDate>=2017-08-11Z10:00:00+1:00))";

final Pattern p1 = Pattern.compile("\\(.*\\)");
StringTokenizer tokens = new StringTokenizer(FILTER_X, ";");
while (tokens.hasMoreTokens()) {
String token = tokens.nextToken();
System.out.println("> : " + token);
Matcher m1 = p1.matcher(token);
while (m1.find()) {
System.out.println(">> : " + m1.group());
}
}

最好将 Pattern 设置为最终的并将其保留在循环之外。

关于java - 模式匹配通过排除最后一个来提取大括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45771431/

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