2016-08-24 18 views
0

私は文字列(ログファイル)を持っているので、2つの文字列間のすべてのテキストを抽出したい(複数のインスタンス)。2つの正規表現間の文字列の抽出

これは私が持っているテキストです。

++ PLANNING ITERATIONS of DEMAND 337 ++ 
========================================= 

Demand: 337 Event: 1189.001 Object/State: 7058/0 Tier: 0 Start: 1608130700 Duration: 90 At: 19-7-2016 16:19:36 
Demand: 337 Event: 1190.001 Object/State: 7059/0 Tier: 0 Start: 1608130830 Duration: 330 At: 19-7-2016 16:19:36 
Demand: 337 Event: 1191.001 Object/State: 7060/0 Tier: 0 Start: 1608140000 Duration: 360 At: 19-7-2016 16:19:36 

++ EVENT PLAN of DEMAND 337 ++ 
=============================== 

event_time(1242.001,1,1609070800,1609071430) 
event_time(1241.001,1,1609060800,1609061430) 
event_time(1240.001,1,1609050800,1609051430) 


++ PLANNING ITERATIONS of DEMAND 174 ++ 
========================================= 

Demand: 174 Event: 212.001 Object/State: 6948/0 Tier: 0 Start: 1609010800 Duration: 390 At: 19-7-2016 16:19:38 
Demand: 174 Event: 213.001 Object/State: 6949/0 Tier: 0 Start: 1609020800 Duration: 390 At: 19-7-2016 16:19:38 

++ EVENT PLAN of DEMAND 174 ++ 
=============================== 

event_time(213.001,1,1609020800,1609021430) 
event_time(212.001,1,1609010800,1609011430) 

私は私が得ることを期待あらゆる事

++ PLANNING ITERATIONS of DEMAND 337 ++ 
========================================= 

そして

++ EVENT PLAN of DEMAND 174 ++ 
=============================== 

間の結果が取得したい:

Demand: 337 Event: 1189.001 Object/State: 7058/0 Tier: 0 Start: 1608130700 Duration: 90 At: 19-7-2016 16:19:36 
Demand: 337 Event: 1190.001 Object/State: 7059/0 Tier: 0 Start: 1608130830 Duration: 330 At: 19-7-2016 16:19:36 
Demand: 337 Event: 1191.001 Object/State: 7060/0 Tier: 0 Start: 1608140000 Duration: 360 At: 19-7-2016 16:19:36 
Demand: 174 Event: 212.001 Object/State: 6948/0 Tier: 0 Start: 1609010800 Duration: 390 At: 19-7-2016 16:19:38 
Demand: 174 Event: 213.001 Object/State: 6949/0 Tier: 0 Start: 1609020800 Duration: 390 At: 19-7-2016 16:19:38 

私はそれを自分で解決しようとしましたが、いくつかの点に着手しましたが、テキストの最後まで最初の試合を返します。

これは私が使用する正規表現です:

Demand:(?s)(.*)[+][+] 

Online Example

+0

これを試してください:/(Demand。*?\ d {2} \ n)/ g' – sideroxylon

+0

これは質問に書いたオンラインの例でも動作しますが、このサイトでは動作しません。 http:// regexstorm。net/tester – Silagy

+0

わかりません - しかしここで動作します(https://regex101.com/r/bF9tX0/1) – sideroxylon

答えて

1

私は最良の方法は、すべてのDemand: ...行を見つけることだと思います。

あなたは、次の正規表現でこれを行うことができます:

(?m)Demand:\s+.*$ 

をこの正規表現は、あなたが望むタイプの1行を検索します。その正規表現に一致するすべての文字列を検索するために使用する言語/ライブラリの関数を使用する必要があります。

冒頭(?m)$全体TXTの終わりを行の末尾にマッチしないように、複数行の略mオプションを設定します。

その後、正規表現は非常に簡単です。 Demmand:の後に少なくとも1つの空白が続き、次に行末までが検索されます。正規表現は、デフォルトでは、行全体で.の検索を展開しないため、スキャンする行に制限されます。しかし、拡張されている(上記の括弧の中にオプションsを使用するなどして)正規表現を(?m)Demand:\s+.*?$に更新する必要があります。つまり、?シンボルを追加して、行の最後まで非貪欲に検索します。

+0

ニース!あなたは私が達成したいことを理解しました!ありがとう! – Silagy

+1

ようこそ。私はregexesが好きです... :-) –

0

あなたの例では、ラインベースなので、私の視点から最善の解決策は、ラインを解析し、比較することだろう - いいえマジック正規表現で。

これを正規表現で解決したい場合は、最初にアンカーを見つけようとします。私はasume ==が良い始まり、++の終わりになるでしょう。これらのアンカー間DOTALL(ない疑問符)非貪欲を使用します。

==\s(.*?)\+\+(オンラインの例では、末尾のだろう使用モードDOTALL、)

その後で最初の部分マッチグループを抽出あなたが望むテキスト

関連する問題