繁体   English   中英

Java需要帮助来改善具有挑战性的正则表达式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM