Java需要帮助提高挑战性正则表达式

时间:2013-11-28 12:08:01

标签: java 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)

任何人都可以帮我吗?我缺少什么?

4 个答案:

答案 0 :(得分:1)

当不在括号内时,通过断言(通过向前看)下一个括号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)]

答案 1 :(得分:0)

    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]
    |
        \\(.*\\)
    )

.*?确保最短的序列与整个模式匹配。

答案 2 :(得分:0)

以下是一些代码:

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)

答案 3 :(得分:0)

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)