从.txt文件中提取所有DATES

时间:2016-11-04 21:32:18

标签: java regex

希望这是短暂的问题.. 在下面的程序中,我已经成功地从名为" pad.txt"的记事本文档中提取了所有数据,该文档由3个垂直对齐的ID'组成。其次是'姓名'接着是“加入日期”,该模式是一致的。

记事本文档仅包含以下内容: dID:1 姓名:鲍勃 加入日期:2014年1月12日 ID:2 姓名:吉姆 加入日期:1993年8月21日 ID:3 姓名:史蒂夫 加入日期:2016年7月6日

我还定义了一个接受可接受的日期格式的正则表达式:1-2位数字,斜杠,1-2位数字,斜线,然后是2到4位数字的YEAR日期..在我指定的开头一个外卡人物"。" < - 带有贪婪量词的点" "明星,在接受日期之前说任何数字的任何一个字符,以及在我也指定了#34;。"之后的日期。

我使用此代码的主要目标是仅提取pad.txt文件中的所有日期,并将它们存储在字符串或其他内容中。

public class Main {

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只返回: "整个团体:2016年6月7日" 如上所述,我的目标是提取所有日期,但是如果.matcher调用只捕获"整个组:2016年6月7日"那么我就无法提及所有日期。 在我看来,我说在日期之前和之后允许任何数量的任何字符,所以它滚动到最底部并且仅查找最后日期,我如何定义正则表达式以便它拉出所有日期,而不是只是最后一个,为什么它只拉最后一个?

我已经无情地尝试了这一点,无法弄清楚如何......

提前致谢

1 个答案:

答案 0 :(得分:1)

嗯,那相对容易。您不能一次编写与所有日期匹配的正则表达式,但您可以使用匹配器,因为它可以使用匹配器,即find()返回true,因为可以找到另一个匹配项。 因此,您必须修改正则表达式并删除两端的.*。然后你可以这样做:

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