in reply to Multiple regex matches in single string

The reason that non-greedy matching (i.e. .+?) doesn't work here is because the regex is matched forward through the string. The non-greedy modifier makes the regex stop at the first end encountered. You would get what you wanted if you reversed both the string and regex. Of course, then you would run into the same problem if there were multiple end lines together.

I'm not sure if this is just a toy example or not, but if this is part of real project you might consider processing the string one line at a time using a state-machine pattern. That will allow you to parse it more robustly, e.g. find unmatched start and end lines, handle nested start-end blocks, print more meaningful error messages, etc.