我将首先发布文本文件中的日期,这只是它的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也会非常有用。

10-07 13:06
查看更多