2011-03-03 45 views
7

我有一個文本文件,我需要使用正則表達式進行分析。我需要捕獲文本是在多組這樣的:如何在java中使用正則表達式捕獲多行模式?

truck 
zDoug 
Doug's house 
(123) 456-7890 
[email protected] 
30 
61234.56 
8/10/2003 

vehicle 
eRob 
Rob's house 
(987) 654-3210 
[email protected] 

在這個例子中我需要捕獲的卡車,然後在接下來的七年lines.In換句話說,在這個「塊」我有8組。這是我做過嘗試,但它不會捕捉下一行:

(truck)\n(\w). 

注:我使用的程序RegExr測試之前,我移植到Java的我正則表達式。

+2

如果需要逐行讀取輸入線,它有什麼用正則表達式來呢? – 2011-03-03 03:34:30

+0

@nikita因爲我想形成團體,其中包括新線 – lampShade 2011-03-03 03:41:11

回答

5
(?m)^truck(?:(?:\r\n|[\r\n]).+$)* 

這是假設整個文本已經被讀入一個字符串(例如,你不是逐行讀取文件),但它不是不是假定行分隔符始終爲\n,如代碼所示。至少應該允許\r\n\r,這也是(?:\r\n|[\r\n])所做的。但它仍然只匹配一個分隔符,所以匹配在塊結束處的雙線分隔符之前停止。

一旦你匹配的數據塊,你可以上線分隔拆分它來獲得各條線。這裏有一個例子:

Pattern p0 = Pattern.compile("(?m)^truck(?:(?:\r\n|[\r\n]).+$)*"); 
Matcher m = p0.matcher(data); 
while (m.find()) 
{ 
    String fullMatch = m.group(); 
    int n = 0; 
    for (String s : fullMatch.split("\r\n|[\r\n]")) 
    { 
    System.out.printf("line %d: %s%n", n++, s); 
    } 
} 

輸出:

line 0: truck 
line 1: zDoug 
line 2: Doug's house 
line 3: (123) 456-7890 
line 4: [email protected] 
line 5: 30 
line 6: 61234.56 
line 7: 8/10/2003

我也假設每行數據包含至少一個字符,並且該數據塊之間的空白行真的是空的 - 也就是說,沒有空格,TAB或其他不可見字符。

(BTW:爲了測試RegExr該正則表達式,除去(?m)並檢查multiline箱代替RegExr通過的ActionScript供電,所以規則是有點不同的對於的Java -Powered正則表達式測試儀,檢查。 RegexPlanet

+0

很好的回答謝謝艾倫! – lampShade 2011-03-03 21:40:46

+0

多好的回答。對此,我真的非常感激。正則表達式非常強大 – lampShade 2011-03-03 22:30:05

3

我認爲,爲了跨越多行的模式應該在DOTALL模式下進行編譯,像

Pattern p = Pattern.compile("truck\\n(.*\\n){7}", Pattern.DOTALL); 
+0

這正則表達式會更接近正確的*無*號的'DOTALL'標誌。事實上,'。*'最初會消耗整個文檔的其餘部分。然後它可能會稍微回退一些,但它仍然會匹配最後一次換行。 – 2011-03-03 07:33:35

+0

啊,貪心! :-)錯過了一個「?」在最後...非常感謝您指出它! – mazaneicha 2011-03-03 12:53:38

+0

沒有必要讓量詞不貪心。只要擺脫'DOTALL'標誌,點將不再符合換行符。 – 2011-03-03 16:12:24

3

這種模式應該工作((.*|\n)*)

+0

這個工程!謝謝! – 2016-10-31 03:32:16