2013-09-26 27 views
1

Я пытаюсь получить строку сообщения из этого файла VMG. Я только хочу, чтобы строки после Даты линии и до "END: VBODY"Regex для строки между двумя строками C#

Лучшее, что я получил до сих пор это регулярное выражение строка НАЧАТЬ: VBODY ([^ \ п] * \ п +) + END: VBODY

Кто может помочь уточнить его?

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

Я не думаю, что вам нужно использовать регулярное выражение. Гораздо проще собрать любую строку после BEGIN: VBODY отображается до тех пор, пока линия не будет END: VBODY – Spaceghost

+0

Эй, Spaceghost, знаете ли вы, какой пример кода C# для этого будет выглядеть? – d123

ответ

1

Если вы хотите использовать регулярное выражение, вы можете изменить текущее регулярное выражение немного, потому что $ 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

0

Вот решение с использованием регулярных выражений,

 string text = @"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"; 


string pattern = @"BEGIN:VBODY(?<Value>[a-zA-Z0-9\r\n.\S\s ]*)END:VBODY";//Pattern to match text. 
Regex rgx = new Regex(pattern, RegexOptions.Multiline);//Initialize a new Regex class with the above pattern. 
Match match = rgx.Match(text);//Capture any matches. 
if (match.Success)//If a match is found. 
{ 
     string value2 = match.Groups["Value"].Value;//Capture match value. 
     MessageBox.Show(value2); 
} 

Демо-версия here.

и теперь не-регулярное выражение раствор,

 string text = @"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 startindex = text.IndexOf("BEGIN:VBODY") + ("BEGIN:VBODY").Length;//The just start index of Date... 
     int length = text.IndexOf("END:VBODY") - startindex;//Length of text till END... 
     if (startindex >= 0 && length >= 1) 
     { 
      string value = text.Substring(startindex, length);//This is the text you need. 
      MessageBox.Show(value); 
     } 
     else 
     { 
      MessageBox.Show("No match found."); 
     } 

Демонстрация here.

Надеюсь, это поможет.

Смежные вопросы