2017-10-11 96 views
0

我有以下模式包含n次在文件中:多線正則表達式java或語法?

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

我的目標是趕上枚舉的所有值。基本上我需要關鍵字「ENUM」和「ENDENUM」之間的三行。

我試圖使用多線正則表達式,但我仍然無法捕捉它。 這裏是我做到了:

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(); 

我使用的是語法,而不是想知道,但它看起來很沉重的這隻使用。我可以用正則表達式來做這種事嗎?

謝謝大家

+0

使用'Pattern.DOTALL' – ctwheels

+1

我不會使用這個正則表達式。只是我的觀點。 – duffymo

回答

0

如果檢查documentation

默認情況下,正則表達式^和$分別忽略的開頭和結尾,行終止,只有比賽,整個輸入序列。如果激活MULTILINE模式,則^在輸入開始處和任何行終止符之後匹配,除了輸入結束處。在MULTILINE模式下$匹配行終止符之前或輸入序列的結尾。

所以,多行標記並不是捕獲多行而是修改錨行爲。

你想使用的是捕捉多行,所以你需要修改.行爲。對於這樣做,你必須使用Pattern.DOTALL標誌

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

Working demo

而且你要抓住從捕獲組1的內容:

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

非常感謝你的工作。 – Amaury