2017-10-11 1 views
0

Ich habe das folgende Muster enthalten n-mal in einer Datei:Multiline Regex Java oder Grammatik?

ENUM CMF_QUOTE_EVENT 
    CMF_QUOTE_EVENT_Activate   "Activate" 
    CMF_QUOTE_EVENT_Suspend    "Suspend" 
    CMF_QUOTE_EVENT_Delete    "Delete" 
ENDENUM 

Mein Ziel ist es, alle Werte der Enumeration zu fangen. Grundsätzlich brauche ich die drei Zeilen zwischen den Keywords "ENUM" und "ENDENUM".

Ich habe versucht, eine Multiline Regex dafür zu verwenden, aber ich kann es immer noch nicht abfangen. Hier ich es tat:

BufferedReader br = new BufferedReader(new FileReader(file)); 
    String line = ""; 
    StringBuilder sb = new StringBuilder();  

    while ((line = br.readLine()) != null) 
    { 
     sb.append(line.replace("\\s",""); // delete tabs and ws 
    } 

    Pattern pattern= Pattern.compile("ENUM(.*)(.|\\s)*ENDENUM", Pattern.MULTILINE); 
    Matcher match = pattern.matcher(sb.toString()); 
    while (match.find()) 
    { 
     // do something 
    }  
    br.close(); 

Ich frage mich stattdessen eine Grammatik, aber es sieht für diesen nur Gebrauch sehr schwer. Kann ich so etwas mit einer Regex machen?

Danke all

+0

Verwenden 'Pattern.DOTALL' – ctwheels

+1

Ich würde dafür keine Regex verwenden. Nur meine Meinung. – duffymo

Antwort

0

Wenn Sie überprüfen die documentation:

standardmäßig die regulären Ausdrücke^und $ line Abbrechern und nur Spiel am Anfang ignorieren und Ende jeweils von die gesamte Eingabesequenz. Wenn der MULTILINE-Modus aktiviert ist, dann stimmt^am Anfang der Eingabe und nach jedem Zeilenabschluss außer am Ende der Eingabe überein. Im MULTILINE-Modus entspricht $ unmittelbar vor einem Zeilenabschluss oder dem Ende der Eingabesequenz.

Also, mehrzeiliges Flag ist nicht zum Erfassen mehrerer Zeilen, sondern zum Ändern des Ankerverhaltens.

Sie möchten mehrere Zeilen erfassen, daher müssen Sie das Verhalten . ändern. Hierfür müssen Sie die Pattern.DOTALL Flagge

Pattern pattern = Pattern.compile("ENUM(.*?)ENDENUM", Pattern.DOTALL); 

Working demo

Und Sie haben verwenden, um den Inhalt von der Erfassungsgruppe greifen 1:

Matcher match = pattern.matcher(sb.toString()); 
while (match.find()) 
{ 
    // do something 
    String enumContent = match.group(1); 
} 
+0

Vielen Dank es funktioniert. – Amaury