[英]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
說明:
編輯:有關性能和內存優化的提示
小步長但顯而易見:將Pattern
聲明為常量,這樣它只能編譯一次
與其填充將隨每次匹配而增長的ArrayList
,而是將每個匹配寫入到某個文件夾中的單個文件-這將執行緩慢,但如果實施得當,則應允許在while (m.find())
每次迭代中對匹配的String
進行垃圾回收。 while (m.find())
循環
迭代終止后,您將不得不再次迭代處理每個小文件
如果這還不夠或者不能解決數據的大小,您可能想要實現自己的自定義解析器,或者以某種方式對數據進行預整理,但這超出了范圍,考慮到您最初的問題是關於Pattern
本身,而不是性能
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.