Если вы хотите использовать регулярное выражение, вы можете изменить текущее регулярное выражение немного, потому что $ 0 группа имеет то, что вы ищете.
BEGIN:VBODY\n?((?:[^\n]*\n+)+?)END:VBODY
В основном то, что произошло ([^\n]*\n+)+
превратился в (?:[^\n]*\n+)+?
(точение этой части ленивой может быть безопаснее)
А затем обернуть всю эту часть вокруг скобок: ((?[^\n]*\n+)+?)
я добавил \n?
, прежде чем это сделать мощность немного чище.
Не-регулярное выражение решение может быть что-то вроде этого:
string str = @"N:
TEL:+65123345
END:VCARD
BEGIN:VENV
BEGIN:VBODY
Date:8/11/2013 11:59:00 PM
thi is a test message
Hello this is a test message on line 2
END:VBODY
END:VENV
END:VENV
END:VMSG";
int startId = str.IndexOf("BEGIN:VBODY")+11; // 11 is the length of "BEGIN:VBODY"
int endId = str.IndexOf("END:VBODY");
string result = str.Substring(startId, endId-startId);
Console.WriteLine(result);
Выход:
Date:8/11/2013 11:59:00 PM
thi is a test message
Hello this is a test message on line 2
ideone demo
Я не думаю, что вам нужно использовать регулярное выражение. Гораздо проще собрать любую строку после BEGIN: VBODY отображается до тех пор, пока линия не будет END: VBODY – Spaceghost
Эй, Spaceghost, знаете ли вы, какой пример кода C# для этого будет выглядеть? – d123