2016-07-29 17 views
0

複数行のデータを正規表現で1行に変換したいとします。正規表現でのみPerlでデータをピボットするには?

データは、HTTPエクスチェンジの開始および終了通知と、1つまたは複数の行に書き込まれた詳細で構成されます。ここで仕事をしているため正規表現は次のとおりです。

(\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。*サーバのインバウンドリクエスト 'がゴミに現れる可能性がある場合は、表示されにくいもので置き換えてください。 \ d + INFO + \ [com \ .LoggingFilter \] \([^)] + \)\ d + \ *サーバーのすべての\インバウンドリクエスト? [here](https://regex101.com/r/tS9aD7/3)を参照してください。 – horcrux

+0

あなたのパターンは一致を見つけるために多くのステップを必要とし、実際のファイルがサンプルよりも大きいと思われます。その結果、このパターンではすぐにバックトラッキング制限に達することがあります。 *唯一の正規表現のアプローチ*が適切ではないと思っても、パターンを改善してステップ数を減らそうとしました。結果はここにあります:https://regex101.com/r/lT4vV4/1 –