0

I have a string (log file), I want to extract all the text between two strings (multiple instances).

This is the text I have:

++ 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)

I want to get every thing between

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

And

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

The results I expect to get is:

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

I tried to solved it myself and i got up to some point, but it returns the first match up to the end of the text.

This is the regular expression i used:

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

Online Example

3
  • Try this: /(Demand.*?\d{2}\n)/g Commented Aug 24, 2016 at 6:07
  • This works on the online example i gave in the question but it doesn't work in this site, why is that? regexstorm.net/tester Commented Aug 24, 2016 at 6:10
  • Not sure - but it works here Commented Aug 24, 2016 at 6:15

2 Answers 2

1

I think the best way would be to just find all the Demand: ... lines.

You could do this with the following regex:

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

This regex finds one line of the type you want. You need to use the function in whatever language/library you use that searches for all the strings that match that regex in you text.

The (?m) at the beginning sets the m option, which stands for multiline, so that the $ will match the end of the line and not the end of the entire txt.

After that the regex is quite simple. It searches for Demmand: followed by at least one space, then everything until the end of the line. The regex by default doesn't expand the . search across lines, and thus is limited to the line it scans. But had it expanded (like by using also the option s inside the preceding parenthesis) you would have had to update the regex to (?m)Demand:\s+.*?$ - that is add the ? symbol to make the search until the end of the line non greedy.

Sign up to request clarification or add additional context in comments.

1 Comment

Nice! You understood what i wanted to achieve! Thanks!
0

Your example is line based, so from my point of view the best solution would be to parse and compare the lines - no magic with regular expressions.

If you want to solve this with regular expressions, first try to find the anchors. I asume == would be a good beginning and ++ an ending. Between these anchors use a non-greedy (not the question mark) dotall:

==\s(.*?)\+\+ (use mode DOTALL, which would be a trailing s in your online example)

Then extract the first submatch group, which is the text you want.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.