2016-06-14 43 views
2

我有一個文本文件的一系列如下:如何使用正則表達式在文本文件中查找一系列數據?

Lots of textLots of textLots of textLots of textLots of textLots of textLots 
of textLots of textLots of textLots of textLots of textLots of textLots of 
textLots of textLots of textLots of textLots of textLots of textLots of 
textLots of text 

Wave amplitude (mean, 3.0 & 7.0 above LES) (mmHg) 
43-152 
35.9 
N/A 
N/A 
N/A 
43.5 
21.9 
N/A 
37.3 
N/A 
40.9 
N/A 

    Wave duration (mean at 3.0 & 7.0 above LES) (sec) 
2.7-5.4 
2.5 
N/A 
N/A 
N/A 
2.2 
3.0 
N/A 
2.2 
N/A 
2.6 
N/A 

    Onset velocity (between 11.0 & 3.0 above LES) (cm/s) 
2.8-6.3 
2.2 
N/A 
N/A 
N/A 
2.5 
1.0 
N/A 
2.5 
N/A 
2.7 
N/A 

Some other textSome other textSome other textSome other textSome other textSome 
other textSome other textSome other textSome other textSome other textSome 
other textSome other textSome other textSome other textSome other textSome 
other text 

的規則是:

1)第一行總是包含一個支架的地方,這是其他地方沒有找到。

2)總是存在在每個系列號碼的端部的空行(或系列N /截至)

3)的值是所有或者數字(帶或不帶小數點)或N /一個。

4)我不想捕獲每個塊(它通常還含有一個標題後的第一個數字 - 或<)

我想捕捉的標題和隨後的編號爲一個的ArrayList。

第一個例子中的預期輸出將因此

[Wave amplitude (mean, 3.0 & 7.0 above LES (mmHg),35.9,N/A,N/A,N/A,43.5,21.9,N/A,37.3,N/A,40.9,N/A] 

我停留在正則表達式,讓我實現這一目標。因爲我想要提取的文本位於一個更大的文本文件中,我認爲我需要使用正則表達式來提取我感興趣的部分。我想另一種方法是隻選擇整個部分的開始和結束我感興趣,但它仍然依賴於一些正則表達式,我認爲這樣做的模式會更復雜。

+0

數字總是一樣嗎? – ClasG

+6

爲什麼使用正則表達式?一行一行地讀取它,將所有內容存儲到數組中的空行並跳過第二行,如果你不需要它? –

+0

[類似這樣?](https://regex101.com/r/rC8cB8/1) – ClasG

回答

2

如果你真的想用正則表達式解析這一點,你可以這樣做:

String pattern = "(?<desc>.*\\(.*\\).*)\n.*-.*\n(?<data>(?:N/A\n|\\d*\\.\\d*\n)+)"; 

String rawData = new String(Files.readAllBytes(Paths.get("indata.txt"))); 
Matcher seriesMatcher = Pattern.compile(pattern).matcher(rawData); 
while(seriesMatcher.find()) { 
    List<String> series = new ArrayList<>(); 
    series.add(seriesMatcher.group("desc").trim()); 
    series.addAll(asList(seriesMatcher.group("data").split("\n"))); 
    System.out.println(series); 
} 

的正則表達式由幾個部分組成:

(?<desc>.*\\(.*\\).*)\n.*-.*\n(?<data>(?:N/A\n|\\d*\\.\\d*\n)+) 
--------------------- ------- --------------------------------- 
description   ignore data 

description = A含線匹配的一對括號。
ignore =帶有短劃線的行,將被忽略。
data =條目,即任意數量的行N/A或十進制數字。

+0

對我來說,這幾乎是我在發佈之前所做的事情,但是看到你是海報就能得到積分。 –

相關問題