0

我是编程和正则表达式的新手,所以这是我的免责声明。

我正在尝试通过我已使用 tshark 传输到 txt 文件的 wireshark 日志来解析我的方式。

我的程序的重点是从 txt 文件的顶部开始并匹配数据包头之间的所有文本。

所有数据包都以 开头Frame\s+\d,不包括下一个数据包标头,并将该文本放入字符串中。

我正在实例化一个对象 ( Packets),然后将它们添加到一个ArrayList以供以后处理。

我需要收集从数据包头 1 到数据包 1 结尾/数据包头 2 开头的所有文本,不包括数据包头 2。

Frame 1 (186 bytes on wire, 186 bytes captured)
    Arrival Time: Sep 19, 2013 13:25:19.937150000
    [Time delta from previous captured frame: 0.000000000 seconds]
    [Time delta from previous displayed frame: 0.000000000 seconds]
    [Time since reference or first frame: 0.000000000 seconds]
    Frame Number: 1
    Frame Length: 186 bytes
    Capture Length: 186 bytes
    [Frame is marked: False]
    [Protocols in frame
............................A bunch of more packet data...............
    Encrypted Packet: 88FE0AFA38B3E1994B907F778FC42CD4FBD967F3D9101679...

Frame 2 (60 bytes on wire, 60 bytes captured)
    Arrival Time: Sep 19, 2013 13:25:19.938495000
    [Time delta from previous captured frame: 0.001345000 seconds]
    [Time delta from previous displayed frame: 0.001345000 seconds]

我试过了:

(Frame\s\d)*.?Frame\s\d

但不是骰子。

我一直在 rubular.com 上查看是否可以为此付费,但我似乎无法满足我的需要。

想法?

4

1 回答 1

0

考虑 中的文件packets.txt/your/path其中包含您发布的示例...

这是一个解决方案。

try {
    // trivial file operations
    String path = "/your/path/packets.txt";
    File file = new File(path);
    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
    String line = null;
    StringBuilder contents = new StringBuilder();
    while ((line = br.readLine()) != null) {
        contents.append(line);
    }
    br.close();
    // the Pattern
    Pattern p = Pattern.compile("Frame\\s\\d\\s(.+?(?=Frame|$))", Pattern.MULTILINE);
    // If you actually need the "Frame etc." header matched as well, here's
    // an alternate Pattern:
    // Pattern p = Pattern.compile("(Frame\\s\\d\\s.+?(?=Frame|$))", Pattern.MULTILINE);
    // matching...
    Matcher m = p.matcher(contents);
    // iterating over matches and printing out group 1
    while (m.find()) {
        System.out.println("Found: " + m.group(1));
    }
}
// "handling" FileNotFoundException
catch (Throwable t) {
    t.printStackTrace();
}

输出:

Found: (186 bytes on wire, 186 bytes captured)    Arrival Time: Sep 19, 2013 13:25:19.937150000    [Time delta from previous captured frame: 0.000000000 seconds]    [Time delta from previous displayed frame: 0.000000000 seconds]    [Time since reference or first frame: 0.000000000 seconds]    
Found: (60 bytes on wire, 60 bytes captured)    Arrival Time: Sep 19, 2013 13:25:19.938495000    [Time delta from previous captured frame: 0.001345000 seconds]    [Time delta from previous displayed frame: 0.001345000 seconds]

的解释Pattern

  • 它会或多或少地查找以原始模式开头的文本(“框架、空格、数字、空格”)
  • 它存储接下来出现的任何内容,包括换行符,但在出现新的“框架”文本或输入文本的结尾时停止
  • 文本匹配点 2 存储在一个组中(组 0 是整个匹配,特定组从索引 1 开始)

编辑:关于性能和内存优化的提示

  • 小步但很明显:将 声明Pattern为常量,因此它只编译一次

  • 而不是填充ArrayList将随着每次匹配而增长的每个匹配项,将每个匹配项写入某个文件夹中的单个文件 - 这将执行缓慢,但如果实施得当,应该允许在循环String的每次迭代中为匹配项进行垃圾收集while (m.find())

  • 一旦迭代终止,您将不得不再次迭代处理每个小文件

  • 如果这还不够,或者只是不适合您的数据大小,您可能希望实现自己的自定义解析器,或者以某种方式对数据进行预分块,但考虑到您最初的问题是关于Pattern本身,而不是性能

于 2013-11-08T22:23:30.550 回答