我首先要发布文本文件中的日期,这只是4行,实际文件是几百行。
2011年9月9日星期五
-STV 101 -------- 05:00 - 23:59 SSB 4185报告于9/08/2011于2:37打印
0-AH 104 -------- 07:00 - 23:00 AH GYM报告于2011年9月9日2:37印刷
-BG 105 -------- 07:00 - 23:00 SH GREAT HALL报告于9/08/2011于2:37印刷
我想对这个文本文件做的是忽略第一行及其上的日期,然后忽略下一行的' - ',但读入“STV 101”,“5:00”和“ 23:59“将它们保存到变量中,然后忽略该行上的所有其他字符,然后对每行进行依此类推。
以下是我目前正在阅读的内容。然后,只要用户将路径放在scheduleTxt JTextfield中,我就调用此函数。它可以很好地读取和打印每一行。
public void readFile () throws IOException
{
try
{
FileInputStream fstream = new FileInputStream(scheduleTxt.getText());
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
while ((strLine = br.readLine()) != null)
{
System.out.println (strLine);
}
in.close();
}
catch (Exception e){//Catch exception if any
System.err.println("Error: " + e.getMessage());
}
}
更新:事实证明我还需要将星期五排除在顶线之外,并将其放入变量中 谢谢!牛肉。
答案 0 :(得分:3)
没有彻底测试,但是这个正则表达式将捕获第2组,第5组和第7组中所需的信息:(假设你只对“0-AH 104”的例子中的“AH 104”感兴趣 - “)
^(\S)*-(([^-])*)(-)+((\S)+)\s-\s((\S)+)\s(.)*
String regex = "^(\\S)*-(([^-])*)(-)+((\\S)+)\\s-\\s((\\S)+)\\s(.)*";
Pattern pattern = Pattern.compile(regex);
while ((strLine = br.readLine()) != null){
Matcher matcher = pattern.matcher(strLine);
boolean matchFound = matcher.find();
if (matchFound){
String s1 = matcher.group(2);
String s2 = matcher.group(5);
String s3 = matcher.group(7);
System.out.println (s1 + " " + s2 + " " + s3);
}
}
可以使用非捕获组调整表达式,以便仅捕获所需的信息。
正则表达式元素的说明:
^(\S)*-
匹配以-
结尾的非空白字符组。 注意:可能是^(.)*-
,如果在第一个-
之前有空格,则无效。(([^-])*)
匹配除-
以外的每个字符的组。(-)+
匹配一个或多个-
的组。 ((\S)+)
匹配一个或多个非空白字符的组。这是在第5组中捕获的。\s-\s
匹配空格组,后跟-
,后跟空格。\s(.)*
匹配空白,后跟任何内容,将跳过。有关正则表达式的更多信息,请参阅此tutorial。 周围还有一些有用的cheatsheets。在设计/调试表达式时,regexp testing tool也可以证明非常有用。