2016-11-04 25 views
1

希望這是短小的問題.. 在下面的程序中,我已成功提取名爲「pad.txt」的記事本文檔中的所有數據,其中包含3組垂直對齊在'ID'後面加上'Name',然後加上'Date Joined',則該模式是一致的。從.txt文件中提取所有日期

記事本文檔僅包括這樣的: DID:1 名稱:已加入鮑勃 日期:2014年1月12日 ID:2 名稱:吉姆 加入日期:1993年8月21日 ID:3加入史蒂夫 日期: 名稱2016年6月7日

我還定義接受可接受的日期格式的正則表達式:再次1-2數字,斜槓,1-2數字,斜槓,然後2至YEAR日期的四位數字。在開始時,我指定了一個通配符「。」。 < - 一個貪婪的量詞「」星點,說的日期之前的任何字符的任意數目的被接受,以及在日後我還指定了

我的主要目標「」。這個代碼是隻提取所有pad.txt文件中的日期,並將其存儲在一個字符串或東西..

公共類主要{

public static void main(String args[]) throws Exception{ 

     StringBuilder builder = new StringBuilder(); 
    FileReader reader = new FileReader(new File("pad.txt")); 

//  Define valid date format via regex 
    String dateRegex = ".* (\\d{1,2})/(\\d{1,2})/(\\d{2,4}) .* "; 

     int fileContent = 0; 
//  iterate through entire notepad doc, until = 0 AKA (finished searching doc) 
    while((fileContent = reader.read()) !=-1){ 

     builder.append((char)fileContent); 

     }//encapsulating loop 
    reader.close(); 

    String extracted = builder.toString(); 
    System.out.println("Extracted: " + extracted); 
    System.out.println(); 

     Matcher m = null; 
//   Validate that file contents conform with 'dateRegex' 
     m = Pattern.compile(dateRegex).matcher(extracted);  
     if(m.find()){ 
     System.out.println("Entire group : " + m.group()); 
     } 
    } 
    } 

不幸的是,m.group() ; outprint僅返回: 「整個組:6/6/2016」 如前所述,我的目標是提取所有日期,但如果.matcher調用只捕獲整個日期,我無法擺弄所有日期group:6/07/2016「 在我看來,我說任何數量的任何字符在日期之前和之後都是允許的,所以它滾動到最底部並只發現最後日期,我如何定義正則表達式以便它抽出所有的日期,而不僅僅是最後一個,爲什麼只抽出最後一個呢?

我這個無情的審判,不能找出如何..

在此先感謝

回答

1

好,這是比較容易的。您無法編寫一次匹配所有日期的正則表達式,但是您可以使用匹配器,因爲它可能會被使用,即find()返回true的頻率與其他匹配一樣多。 所以你必須修改你的正則表達式並刪除兩端的.*。那麼你可以簡單地做到這一點:

StringBuilder dateListBuilder = new Stringbuilder(); 
while(m.find()){ 
    dateListBuilder.append(m.group()); 
} 
System.out.println(dateListBuilder.toString()); 
+0

AH!就這麼簡單,我知道我的.group實現必須稍微錯誤,非常感謝!有了這個,我已經進一步邁向正則表達式理解:) – Keith