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 に答える