2014-11-13 3 views
0

Итак, у меня есть одна строка, содержащая несколько вхождений подстроки. Все эти строки имеют следующий формат: <[email protected]=someText>Content<c>Regex соответствует нескольким подстрокам внутри строки

Пример:

This combination of plain text and <[email protected]> colored text<c> is valid. <[email protected]>Multiple tags are also valid.<c> 

Я хочу, чтобы извлечь каждый из подстрок с помощью регулярных выражений. Однако, если я использую следующее регулярное выражение <[email protected]+?(?=>)>.*<c> Он соответствует всем, начиная с первого <c... и заканчивая последними <c>. Я хочу, чтобы каждая из этих подстрок была как один элемент. Как я могу это сделать, и если я не могу сделать это с помощью регулярного выражения, каким будет лучший способ достичь моей цели.

+1

Remove '(? =>)', и попытайтесь понять, как работает ваш шаблон, вы найдете решение. –

+0

Возможно, это поможет: http://stackoverflow.com/questions/4892452/regex-match-multiple-times-in-string – gcarvelli

+0

Вы просто хотите текст внутри этих тегов? – Jonesopolis

ответ

1
string input = @"This combination of plain text and <[email protected]> colored text<c> is valid. <[email protected]>Multiple tags are also valid.<c>"; 

var matches = Regex.Matches(input, @"<[email protected](.+?)>(.+?)<c>") 
       .Cast<Match>() 
       .Select(m => new 
       { 
        Name = m.Groups[1].Value, 
        Value = m.Groups[2].Value 
       }) 
       .ToList(); 
+0

Это именно то, что я ищу. Хотя @Jonesy также имеет хороший код, ваш более понятный и не содержит строк для выбора групп. – Ruhrpottpatriot

1

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

var pattern = @"(?<=<[email protected])(?<type>[^>]+)>(?<text>.+?)(?=<c>)"; 
var str = @"This combination of plain text and <[email protected]> colored text<c> is valid. <[email protected]>Multiple tags are also valid.<c>"; 

foreach (Match match in Regex.Matches(str, pattern)) 
{ 
    Console.WriteLine(match.Groups["type"].Value); 
    Console.WriteLine(match.Groups["text"].Value); 

    Console.WriteLine(); 
} 

выход:

flavor 
colored text 

warning 
Multiple tags are also valid. 

картина:

(?<=<[email protected]) : Ищите <[email protected]

(?<type>[^>]+)> : захватить все, пока >, не называйте его type

(?<text>.+?) : захватить все до опережающего просмотра, не называйте его text

(?=<c>) : Стоп, когда вы найдете <c>