2016-11-04 27 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