2017-06-21 5 views
-2

Ich habe diese Situation, ich möchte die Anweisung1 dieser Zeichenfolge Ausdruck extrahieren, aber ich bin kein Experte in Regex.Java Regex, extrahieren 2. Anweisung

String expression = "blabla if(x = 6, statement1, statement2) blabla"; 

aber statement1 rekursiv eine andere sein, wenn Ausdruck, wie:

String expression = "blablaba iF(X = 6, if(X = 3, Z, Y), Y) bablabla"; 

in diesem Fall muss ich Z extrahieren, oder zumindest if(X = 3, Z, Y)

ich gemacht, dass:

String IF_CONDITION_PATTERN = "[\\s|\\n|\\t]if\\s*\\((.*)\\,(.*)\\,(.*)([^)]*?)"; 

String formulaStr = "blablaba iF(X = 6, if(X = 3, Z, Y), Y) bablabla"; 

Pattern pattern = Pattern.compile(IF_CONDITION_PATTERN, 
      Pattern.CASE_INSENSITIVE); 
Matcher matcher = pattern.matcher(formulaStr); 

while (matcher.find()) { 
    for(int i=0; i<matcher.groupCount();i++){ 
      System.out.println("Found " + i + ": " + matcher.group(i) + "."); 
     } 
    } 

Das Ergebnis ist:

Found 0: iF(X = 6, if(X = 3, Z, Y), Y) bablabla. 
Found 1: X = 6, if(X = 3, Z. 
Found 2: Y). 
Found 3: Y) bablabla. 

Kann mir jemand helfen, zumindest die Aussage zu extrahieren1 if(X = 3, Z, Y).

Danke, Nuno

+0

Regex nicht rekursive Ausdrücke behandeln. Zumindest nicht in Java. Sie benötigen dafür einen geeigneten Parser. – RealSkeptic

+0

Ich weiß das, aber was ich verlange, ist eine Regex zu haben, die die Anweisung1 extrahieren kann, in diesem Fall ist if (X = 3, Z, Y) –

+0

Nun, wenn es rekursive Ausdrücke nicht analysieren kann, Woher weiß es, wann der interne Ausdruck endet? Was ist, wenn statt "Z" ein anderes "if" vorhanden ist? Du hast gesagt, es ist rekursiv. Daher kann es nicht mit einer Regex geparst werden. Daher kann eine Regex nicht mit dem gewünschten Teil übereinstimmen. – RealSkeptic

Antwort

0

Versuch, wenn regex für Sie unten funktioniert, wird es statement1 und Z für Ihr Beispiel entsprechen.

Die Regex suchen Sie einfach nach if-Anweisung dann das zweite Argument entsprechen, die nicht enthält , innen

\bif\([^,]+,\s?([^,]+),[^,]+\)

demo

+0

Vielen Dank, für mich ist es genug. –