簡體   English   中英

需要正則表達式來匹配第一個實例直到下一個實例(不包括下一個“前瞻”)Java

[英]Need regex to match first instance until next instance (excluding next “look-ahead”) Java

我是編程和正則表達式的新手,所以這是我的免責聲明。

我正在嘗試通過Wireshark日志解析我的方式,該日志已使用tshark轉移到txt文件。

我的程序的重點是從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,看看是否可以按此付款,但似乎無法滿足我的需求。

有什么想法嗎?

考慮/your/path中的一個packets.txt文件,其中包含您發布的示例...

這是一個解決方案。

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 ,而是將每個匹配寫入到某個文件夾中的單個文件-這將執行緩慢,但如果實施得當,則應允許在while (m.find())每次迭代中對匹配的String進行垃圾回收。 while (m.find())循環

  • 迭代終止后,您將不得不再次迭代處理每個小文件

  • 如果這還不夠或者不能解決數據的大小,您可能想要實現自己的自定義解析器,或者以某種方式對數據進行預整理,但這超出了范圍,考慮到您最初的問題是關於Pattern本身,而不是性能

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM