我将首先发布文本文件中的日期,这只是它的4行,实际文件的长度为几百行。
2011年9月9日,星期五
-STV 101 -------- 05:00-23:59 SSB 4185报告于2011年8月8日2:37打印
0-AH 104 -------- 07:00-23:00 AH GYM报告于2011年8月8日2:37打印
-BG 105 -------- 07:00-23:00 SH大大厅报告于2011年8月8日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());
}
}
更新:事实证明,我还需要将星期五从顶部删除,并将其放入变量中
谢谢!牛肉。
最佳答案
尚未对其进行全面测试,但是此正则表达式将捕获第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)+)'与4相同。在组7中捕获。
\s(.)*
匹配空格,后跟所有将被跳过的空格。可在此tutorial上找到有关正则表达式的更多信息。
周围还有一些有用的cheatsheets。在设计/调试表达式时,regexp testing tool也会非常有用。