2016-06-17 52 views
1

我有一個這樣的字符串:Java的正則表達式的遞歸匹配

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代碼:來完成,這將是要創造定位和IF使用正則表達式語句返回任內的方法

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); 
} 
+0

在代碼的哪裏添加'new'和'3'?什麼是規格? –

+0

正則表達式不是遞歸的工具。你看起來像某種語言,你可能想要考慮一些像[ANTLR](http://www.antlr.org/),或者建立你自己的解析器。 – totoro

回答

1

的一種方式。在這種方法中,每當您的正則表達式匹配找到另一個內部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; 
}