2015-09-30 6 views
0

У меня есть следующие строки:Извлечь текст между ~ теги

~header1 
content1 
content2 
content3 
content4 
~header2 
content5 
content6 
content7 
content8 
~header3 
content9 
content10 
content11 
content12 
~header4 

Мне нужно извлечь содержимое между каждым заголовком (~header) с использованием регулярных выражений в языке С #. Как это сделать?

Я попытался с помощью следующего кода:

string pattern = "\\~.*\\~"; 

MatchCollection matches = Regex.Matches(data , pattern, RegexOptions.Multiline) ; 

Но не получаю никакого вывода.

Так будет массив в качестве выходного сигнала, пусть его имя m с его содержанием:

m[0] = "~header1|content1|content2|content3|content4"; 
m[1] = "~header2|content5|content6|content7|content8"; 
etc 
+0

Вы должны использовать 'RegexOptions.Singleline' –

ответ

1

Это будет делать трюк для вас

string[] m = Regex.Split(value1, @"(?=~header)").Where(x => !string.IsNullOrEmpty(x)).ToArray(); 
+1

не в случае' conte ~ nt10' – fubo

+0

Я редактирую вопрос. –

+0

@ fajar66: взгляните на обновленный ответ. –

1

Вы можете использовать lookarounds здесь.

(?<=~header\d+)[\s\S]*?(?=~header\d+) 

string strRegex = @"(?<=~header\d+)[\s\S]*?(?=~header\d+)"; 
Regex myRegex = new Regex(strRegex, RegexOptions.None); 
string strTargetString = @"~header1" + "\n" + @"content1" + "\n" + @"content2" + "\n" + @"content3" + "\n" + @"content4" + "\n" + @"~header2" + "\n" + @"content5" + "\n" + @"content6" + "\n" + @"content7" + "\n" + @"content8" + "\n" + @"~header3" + "\n" + @"content9" + "\n" + @"content10" + "\n" + @"content11" + "\n" + @"content12" + "\n" + @"~header4"; 

foreach (Match myMatch in myRegex.Matches(strTargetString)) 
{ 
    if (myMatch.Success) 
    { 
    // Add your code here 
    } 
} 
1

Вы можете использовать регулярное выражение, чтобы соответствовать что-либо, начиная с ~ с последующим любым символом, кроме ~, а затем заменить новую строку с трубой:

var res = Regex.Matches(data, @"~[^~]*").Cast<Match>() 
        .Select(p => p.Value.Replace("\r\n", "|").TrimEnd('|')) 
        .ToList(); 

Результат:

enter image description here

Если у вас есть смешанные линии, вам понадобится еще Regex.Replace(p, @"\r?\n|\r", "|") внутри .Select.

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