[英]Java need help improve challenging regex
我们有一个业务规则,如下所示:
String S= "IF (A=3 AND B=2)=0 AND IF(c=4 AND D=5)=1 AND (AGE>=15 AND AGE<=45)"
我必须将上面的字符串分成三部分,如下所示:
IF (A=3 AND B=2)=0
IF(c=4 AND D=5)=1
(AGE>=15 AND AGE<=45)
我尝试使用以下正则表达式来拆分[^AND].*\\\\)=0|1
,但我得到的是前两个而不是最后一个(AGE>=15 AND AGE<=45)
。
谁能帮我这个 ? 我缺少什么?
断言(通过向前看)下一个括号char(如果有)是一个开放的括号,以在AND
不在括号内时进行拆分:
String[] parts = str.split(" *AND *(?=[^)]*(\\(|$))");
这是一些显示此功能的测试代码:
String str = "IF (A=3 AND B=2)=0 AND IF(c=4 AND D=5)=1 AND (AGE>=15 AND AGE<=45)";
String[] parts = S.split(" *AND *(?=[^)]*(\\(|$))");
System.out.println(Arrays.toString( parts));
输出:
[IF (A=3 AND B=2)=0, IF(c=4 AND D=5)=1, (AGE>=15 AND AGE<=45)]
String s =
"IF (A=3 AND B=2)=0 AND IF(c=4 AND D=5)=1 AND (AGE>=15 AND AGE<=45)";
Pattern exprPattern = Pattern.compile("(IF\\s*\\(.*?\\)=[01]|\\(.*\\))");
Matcher m = exprPattern.matcher(s);
while (m.find()) {
System.out.println("* " + m.group());
}
这试图通过两个替代子模式来识别这三个部分:
(
IF\\s*\\(.*?\\)=[01]
|
\\(.*\\)
)
.*?
确保最短序列与整个模式匹配。
这是一些代码:
String s = "IF (A=3 AND B=2)=0 AND IF(c=4 AND D=5)=1 AND (AGE>=15 AND AGE<=45)";
for (String part : s.split("AND (?=[^)]*(\\(|$))")) {
System.out.println(part);
}
生产:
IF (A=3 AND B=2)=0
IF(c=4 AND D=5)=1
(AGE>=15 AND AGE<=45)
String s = "IF (A=3 AND B=2)=0 AND IF(c=4 AND D=5)=1 AND (AGE>=15 AND AGE<=45)";
String[] a =s.split("(?<=(\\)=[01]))\\sAND\\s");
for(String d:a){
System.out.println(d);
}
产量
IF (A=3 AND B=2)=0
IF(c=4 AND D=5)=1
(AGE>=15 AND AGE<=45)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.