C # Regex: возвращение коллекции результатов - PullRequest
2 голосов
/ 18 сентября 2009
string: "<something><or><other>"
regex pattern: "<(\w+)><(\w+)><(\w+)>"

Как мне сделать вызов регулярного выражения, который возвращает мне коллекцию результатов, содержащую все, что находится в скобках? Например, я хотел бы, чтобы набор результатов {"что-то", "или", "другой"}.

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

Спасибо.

Ответы [ 4 ]

1 голос
/ 18 сентября 2009

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

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 голосов
/ 19 сентября 2009

Есть много способов снять шкуру с этой кошки:

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();
    }
  }
}
0 голосов
/ 18 сентября 2009

Использовать MatchCollection. РЕДАКТИРОВАТЬ: Забыл изменить регулярное выражение на то, что вы запрашивали. Код ниже генерирует следующий вывод:

что-то
или
прочее

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

  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 голосов
/ 18 сентября 2009

Я думаю, что вы ищете 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
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...