希望这是短暂的问题.. 在下面的程序中,我已经成功地从名为" 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日"那么我就无法提及所有日期。 在我看来,我说在日期之前和之后允许任何数量的任何字符,所以它滚动到最底部并且仅查找最后日期,我如何定义正则表达式以便它拉出所有日期,而不是只是最后一个,为什么它只拉最后一个?
我已经无情地尝试了这一点,无法弄清楚如何......
提前致谢
答案 0 :(得分:1)
嗯,那相对容易。您不能一次编写与所有日期匹配的正则表达式,但您可以使用匹配器,因为它可以使用匹配器,即find()
返回true
,因为可以找到另一个匹配项。
因此,您必须修改正则表达式并删除两端的.*
。然后你可以这样做:
StringBuilder dateListBuilder = new Stringbuilder();
while(m.find()){
dateListBuilder.append(m.group());
}
System.out.println(dateListBuilder.toString());