2

我正在做一个项目,我必须解析文本文件并从中提取相关信息以供以后使用。

我创建了一个正则表达式来匹配具有相关数据的文本行,但我不确定如何从行中提取相关信息并将其转储到新的文本文件中。

这是我正在解析的文本文件的示例:

[  5] local 10.170.150.195 port 42507 connected with 184.72.63.139 port 5001
[  4] local 10.170.150.195 port 42506 connected with 184.72.63.139 port 500
[  1]  0.0- 1.0 sec  0.00 KBytes  50.00 Kbits/sec

在这个示例中,相关信息是“0.0-1.0 sec”和 50.00 Kbits/sec。

这是我的正则表达式:

[  [0-6]]  0.0- 1.0 sec  0.00 KBytes  [0-9]*.[0-9][0-9] Kbits/sec

抱歉,如果这是一个微不足道的问题,我对 java 还很陌生......这是第 3 天......任何和所有的帮助将不胜感激。

谢谢你

4

3 回答 3

2

您将使用括号来捕获所需的组,然后将这些组打印到输出。

    Pattern pattern = Pattern.compile("\\[  [0-6]\\]  (0.0- 1.0 sec)  0.00 KBytes  ([0-9]*.[0-9][0-9] Kbits/sec)");

    String line = "[  1]  0.0- 1.0 sec  0.00 KBytes  50.00 Kbits/sec";
    Matcher matcher = pattern.matcher(line);
    if (matcher.matches()) {
        System.out.println(matcher.group(1) + "\t" + matcher.group(2));
    }

这里patternobject 是您的正则表达式,您可以将它重用于所有行。对于文件的每一行,您创建一个新文件matcher并将其传递给该行。然后,如果该行与正则表达式匹配,则打印捕获组。

于 2012-10-13T05:52:49.293 回答
0
  1. 使用 FileReader/BufferedReader 打开您的输入文件。

    FileReader fr = new FileReader("input.txt");
    BufferedReader br = new BufferedReader(fr);
    
  2. 使用 FileWriter/BufferedWriter 打开输出文件

    FileWriter fw = new FileWriter("output.txt");
    BufferedWriter bw = new BufferedWriter(fw);
    
  3. 使用缓冲阅读器一次将一行读while loop入字符串

    String lineString = null;
    while((lineString= br.readLine())!= null){
          //....
     }
    
  4. 在 内while loop,将读取的字符串与您的正则表达式匹配

    Pattern pattern = 
    Pattern.compile("\\[  [0-6]\\]  (0.0- 1.0 sec)  0.00 KBytes  ([0-9]*.[0-9][0-9] Kbits/sec)");
    Matcher matcher = pattern.matcher(lineString);
    if(matcher .matches()){
       //....
    }
    
  5. 如果找到匹配项,则使用缓冲写入器将字符串写入输出文件

        bw.write(lineString);
    
  6. 关闭所有打开的读取器/写入器。

        bw.close();
        fw.close();
        br.close();
        fr.close();
    

编辑: 示例代码样式 1 如下:

    String regex = "\\[  [0-6]\\]  (0.0- 1.0 sec)  0.00 KBytes  ([0-9]*.[0-9][0-9] Kbits/sec)";
    FileReader fr = new FileReader("input.txt");
    BufferedReader br = new BufferedReader(fr);

    FileWriter fw = new FileWriter("output.txt");
    BufferedWriter bw = new BufferedWriter(fw);

    String lineString = null;
    while((lineString= br.readLine())!= null && 
                  !lineString.equals("Starting Test 2: Iperf TCP East....")){
        if(lineString.matches(regex)){
            bw.write(lineString);
        }
    }
    bw.close();
    fw.close();
    br.close();
    fr.close();

示例代码样式 2 如下:

 FileReader fr = new FileReader("input.txt");
 BufferedReader br = new BufferedReader(fr);
 FileWriter fw = new FileWriter("output.txt");

 BufferedWriter bw = new BufferedWriter(fw);

 Pattern pattern = 
    Pattern.compile("\\[  [0-6]\\]  (0.0- 1.0 sec)  0.00 KBytes  ([0-9]*.[0-9][0-9] Kbits/sec)");

    String lineString = null;
    while((lineString= br.readLine())!= null && !lineString.equals("Starting Test 2: Iperf TCP East....")){
        Matcher matcher = pattern.matcher(lineString);
        if(matcher.matches()){
            bw.write(lineString);
        }
    }
    bw.close();
    fw.close();
    br.close();
    fr.close();

祝一切顺利!

于 2012-10-13T05:43:16.453 回答
0

如果您可以访问 unix 终端或 grep,那么这一行命令应该可以解决问题。

grep "[ [0-6]] 0.0- 1.0 sec 0.00 KBytes [0-9]*.[0-9][0-9] Kbits/sec" yourfile > newfile.txt

newfile.txt 将包含 yourfile 中与正则表达式模式匹配的所有行

于 2012-10-14T06:21:58.240 回答