2009-09-18 3 views
2
string: "<something><or><other>" 
regex pattern: "<(\w+)><(\w+)><(\w+)>" 

Как создать вызов регулярного выражения, который возвращает мне коллекцию результатов, содержащую все между круглыми скобками? Например, мне нужен результирующий набор {"something", "or", "other"}.C# Regex: возвращает коллекцию результатов

Для бонусных очков, что называется? Захватывает? Захват групп? Какой-то шаблон? Я чувствую, что если бы я знал правильную терминологию, которую я мог бы найти.

спасибо.

+0

Для тех, кто использует метод «соответствий»: этот метод будет соответствовать целому шаблону регулярного выражения и возвращает коллекцию всех матчей всей картины , Этот вопрос относится к отдельным группам захвата, которые должны запрашиваться с использованием свойства Groups отдельного объекта Match. –

+0

@Sid Вопрос достаточно неоднозначен, что либо «Матчи», либо «Группы» должны работать нормально. ОП попросил научиться делать вызов Regex, который возвращает «набор результатов, содержащий все, что находится между круглыми скобками», и любой из них удовлетворяет этому. – Donut

+0

Метод «Матчи» не даст вам запрошенных результатов для любого шаблона ввода. Простой шаблон, такой как @ "(\ w +) (\ d +)", будет значительно больше кода с помощью метода совпадений для одного и того же вывода. Кроме того, он упоминает захваты и группы захвата, которые должны указывать на то, что он ищет отдельные группы захвата матча, а не весь матч. –

ответ

1

Они обычно называют группы захвата , и вы можете получить е захватывает, как показано:

Regex regex = new Regex(@"some (pattern)"); 
Match m = regex.Match("some pattern"); 

foreach (Capture c in m.Groups) { 
    Console.WriteLine(c.Value); // write the value to the console "pattern" 
} 

m.Groups.Count даст вам знать, сколько групп совпадают, m.Groups[0] всегда будет полный текст матча.

0

Я думаю, что вы ищете MatchCollection:

Представляет набор успешных найденных совпадений итеративного применения шаблона регулярного выражения для входной строки в.

Пример:

string input = "<something><or><other>"; 
string pattern = "(?<=<)[^>]*(?=>)"; 

MatchCollection matches = Regex.Matches(input, pattern); 

foreach (Match match in matches) 
{ 
    Console.WriteLine(match.ToString()); // do something with match here 
} 

Edit: Изменено регулярное выражение из этого:
<(\w+)><(\w+)><(\w+)>
к этому:
(?<=<)[^>]*(?=>)

+0

Не совсем, это дает мне один матч за "". Я хочу три матча, один для «что-то», один для «или», а другой для «другого». – 2009-09-18 15:42:03

+0

@ david Я изменил ваше Regex; попробуйте пример сейчас. Он должен дать вам результаты, которые вы хотите. – Donut

0

Использование MatchCollection. EDIT: Забыл изменить регулярное выражение на то, что вы запрашивали. Приведенный ниже код генерирует следующий вывод:

что-то
или
другие

Это то, что вы искали?

static void Main(string[] args) 
    { 
     var str = "<something><or><other>"; 
     var re = new Regex(@"(\w+)"); 
     MatchCollection mc = re.Matches(str); 

     foreach (Match m in mc) 
     { 
      Console.WriteLine(m.Value); 
     } 
    } 
0

Есть много способов кожи этого кота:

using System; 
using System.Text.RegularExpressions; 

namespace Test 
{ 
    class Test 
    { 
    static void Main(string[] args) 
    { 
     string target = @"<something><or><other>"; 

     // One group, many matches 
     Regex r1 = new Regex(@"<(\w+)>"); 
     MatchCollection mc = r1.Matches(target); 
     foreach (Match m in mc) 
     { 
     Console.WriteLine(m.Groups[1].Value); 
     } 
     Console.WriteLine(); 

     // One match, many groups 
     Regex r2 = new Regex(@"<(\w+)><(\w+)><(\w+)>"); 
     Match m2 = r2.Match(target); 
     if (m2.Success) 
     { 
     foreach (Group g in m2.Groups) 
     { 
      Console.WriteLine(g.Value); 
     } 
     } 
     Console.WriteLine(); 

     // One group, one match, many captures 
     Regex r3 = new Regex(@"(?:<(\w+)>)+"); 
     Match m3 = r3.Match(target); 
     if (m3.Success) 
     { 
     foreach (Capture c in m3.Groups[1].Captures) 
     { 
      Console.WriteLine(c.Value); 
     } 
     } 
     Console.WriteLine(); 

     // Many matches, no groups, no captures 
     Regex r4 = new Regex(@"(?<=<)\w+(?=>)"); 
     foreach (Match m in r4.Matches(target)) 
     { 
     Console.WriteLine(m.Value); 
     } 
     Console.ReadLine(); 
    } 
    } 
} 
Смежные вопросы