2013-03-20 7 views
1

Я просто не могу его получить .... У меня есть строка текста, в которой мне нужно извлечь повторяющийся шаблон, но я могу получить только небольшую часть, или я получаю один совпадение всей строки ...Регулярные выражения - Повторяющийся шаблон

Строка представляет собой конкатенацию «маркеров» плюс «контент», и мне нужно извлечь каждый маркер и его содержимое.

string s = "T:  2 YE    I:  4 YE"; 
Match m = Regex.Match(s, "(?'marker'(T|I)):(?'content'.+)"); 
while (m.Success) 
{ 
    string Marker = m.Groups["marker"].value; // (T: or I:) 
    string Content = m.Groups["content"].value; // (2 YE or 4 YE) 
    m = m.NextMatch(); 
} 

Я пробовал оба «+» и «. +?» для захвата max/min, но я либо получаю 2 совпадения, у которых есть маркеры, но нет содержимого или один соответствует входной строке WHOLE.

Любые указатели пожалуйста :)

+0

Может T или я быть частью контента? –

+0

Opps ... забыли «nextmatch()» –

+0

Они никогда не будут в содержании ... однако я не возражаю, чтобы они были извлечены как часть группы соответствия контента (вместо нее или группы маркеров ( –

ответ

1
(?'marker'(T|I)):(?'content'.+) 

не будет работать, потому что .+ будет потреблять всю оставшуюся часть строки (она совпадает с жадностью, и нет ничего предотвращения его потребления остальной части линии).

(?'marker'(T|I)):(?'content'.+?) 

.+? будет только потреблять один символ, а затем остановиться, так как он неохотно матчей.

Вам нужно будет указать, когда заканчивается контент. Я действительно не понимаю формат, который вы предоставили достаточно хорошо, чтобы быть уверенным, что я знаю правильный способ сделать это, но предполагая, что любое количество заглавных букв, сопровождаемых двоеточием (например, «T:», «ST:», или «орангутаны:») квалифицировать в качестве маркеров, это должно работать:

([A-Z]+:)(((?![A-Z]+:).)+) 

который использует negative lookahead, чтобы понять, где начинается следующий маркер. Первая и вторая группы захвата должны фиксировать маркер и контент соответственно.

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

(?'marker'[A-Z]+:)(?'content'((?![A-Z]+:).)+) 
+0

Awesome Regex и приятное объяснение - отрицательный Lookahead всегда до сих пор ловит меня !! +1 –

+0

Просто билет .... Спасибо! –

0

Попробуйте это:

Regex("(T:|I:)").Split(s); 
Смежные вопросы