Java Regex递归匹配

时间:2016-06-17 21:07:21

标签: java regex

我有一个这样的字符串:

IF(expr1,text1,IF(expr2,text2,IF(expr3,text3,text4)))

我需要处理IF(expr3,text3,text4))),以便上述内容成为

 IF(expr1,text1,IF(expr2,text2,new_text))

我需要继续这样做,直到我有

 IF(expr1,text1,new_text3)

我的模式字符串"IF\\(.*?,.*?,.*?\\)"将匹配整个事物。不是IF(expr3,text3,text4)))

Java代码:

String val = "IF(expr1,text1,IF(expr2,text2,IF(expr3,text3,text4)))";
String regx = "IF\\(.*?,.*?,.*?\\)";  
Pattern patt1 = Pattern.compile(regx);
Matcher m2 = patt1.matcher(val);
while (m2.find()) { 
    String val0 = m2.group();
    System.out.println( val0 ); 
}  

1 个答案:

答案 0 :(得分:1)

实现此目的的一种方法是创建一个使用regex定位并返回任何内部IF语句的方法。在这种方法中,每当你的正则表达式匹配找到另一个内部IF语句时,你就会调用它自己。这是一个非常简化的片段,仅用于演示该概念。这基本上实现了递归正则表达式匹配,但是由于缺乏对标准Java中的递归正则表达式的支持,因此需要手动完成。我在这里即兴创作,因为我没有编译器来测试它。但是,您需要修改匹配的正则表达式以查找第一个内部IF语句。也许像^IF\(.*?,.*?,(IF\(.*\))\)这样的正则表达式可以起作用吗?

String val = 'IF(expr1,text1,IF(expr2,text2,IF(expr3,text3,text4)))';

String mostInnerIfStatement = getInnerIfStatement(val);

// no inner IF statement found
if(mostInnerIfStatement == null) {
    // handle scenario where IF statement has no inner IF statements
}

String getInnerIfStatement(String val) {
    String regx = '^IF\\(.*?,.*?,(IF\\(.*\\))\\)';  
    Pattern patt1 = Pattern.compile(regx);
    Matcher m2 = patt1.matcher(val);

    // initialize to value passed in
    String nextInnerIfStatement = val;

    // test if match found
    if(m2.find()) {
        // call self if another match found
        String result = getInnerIfStatement(m2.group());

        // if result is null then no more inner IF statements found so do not set nextInnerIfStatement
        if(result != null) {
            nextInnerIfStatement = result;
        }
    }

    return nextInnerIfStatement;
}