2016-07-29 17 views
0

我想用多個正則表達式將多行數據轉換成一行。如何僅用正則表達式在Perl中轉換數據?

數據包含HTTP交換的開始和結束通知,後面跟着一行或多行的詳細信息。這裏是做這項工作的正則表達式:

(\d+-\d+-\d+) (\d+:\d+:\d+,\d+) INFO (\[com\.LoggingFilter\]) \(([^)]+)\) (\d+) \* Server in-bound request 
(?=\5 > (.+) 
[\s\S]* 
\5 > user-agent:\s*(.+) 
[\s\S]* 
(\d+-\d+-\d+) (\d+:\d+:\d+,\d+) INFO \3 \(\4\) \5 \* Server out-bound response 
\5 < (\d+) 
[\s\S]*) 

它(幾乎)工作原理:VIEW regex in action。在正則表達式替換之後,一些細節(由積極的展望保存)仍然保留。如何得到以下結果的

"88598";"2016-07-29";"00:00:08,262";"2016-07-29";"00:00:08,262";"http-10.2.3.4-8080-14";"Java/1.7.0_79";"303";"GET http://1.2.3.4:8080/service/api/ 
"88599";"2016-07-29";"00:00:08,382";"2016-07-29";"00:00:08,382";"http-10.2.3.4-8080-8";"Java/1.7.0_79";"303";"GET http://1.2.3.4:8080/service/api/" 
(...) 

代替

"88598";"2016-07-29";"00:00:08,262";"2016-07-29";"00:00:08,262";"http-10.2.3.4-8080-14";"Java/1.7.0_79";"303";"GET http://1.2.3.4:8080/service/api/"88598 > GET http://1.2.3.4:8080/service/api/ 
<garbage data here> 
"88599";"2016-07-29";"00:00:08,382";"2016-07-29";"00:00:08,382";"http-10.2.3.4-8080-8";"Java/1.7.0_79";"303";"GET http://1.2.3.4:8080/service/api/"88599 > GET http://1.2.3.4:8080/service/api/ 
(...) 
+0

你已經給我們你的正則表達式,你得到的輸出和你想得到的輸出。這很好。我們缺少的是輸入數據的一個例子。 –

+2

@DaveCross這是在正則表達式演示。 – horcrux

+2

這樣做「只用正則表達式」是一種不好的方法(效率低下),您應該考慮逐行或分塊方法。 –

回答

0

這似乎工作:

(\d+-\d+-\d+) (\d+:\d+:\d+,\d+) INFO (\[com\.LoggingFilter\]) \(([^)]+)\) (\d+) \* Server in-bound request 
(?=\5 > (.+) 
[\s\S]* 
\5 > user-agent:\s*(.+) 
[\s\S]* 
(\d+-\d+-\d+) (\d+:\d+:\d+,\d+) INFO \3 \(\4\) \5 \* Server out-bound response 
\5 < (\d+) 
[\s\S]*)[\s\S]*?((?=\n.*Server in-bound request)|(?![\s\S])) 

Here演示。

+0

如果'Server in-bound request'出現在垃圾中,它會保存在最終結果中。請參閱:https://regex101.com/r/tS9aD7/2 – Stephan

+0

在某些方面,您應該有一個標準,以區分垃圾和非垃圾的東西。如果'\ n。*服務器入站請求'可能出現在垃圾中,請將其替換爲不太可能出現的內容。例如整個'\ n \ d + - \ d + - \ d + \ d +:\ d +:\ d +,\ d + INFO + \ [com \ .LoggingFilter \] \([^)] + \)\ d + \ * Server入境請求?見[這裏](https://regex101.com/r/tS9aD7/3)。 – horcrux

+0

你的模式需要很多步驟來找到匹配,我懷疑真實文件比樣本大。這種模式的後果可能會很快達到回溯極限。即使我認爲只有正則表達式的方法不適用,我也試圖改進模式以減少步驟數量。你會在這裏找到結果:https://regex101.com/r/lT4vV4/1 –