Извлеките числовые значения, заключенные в фигурные скобки

#c# #regex #capture #regex-group

#c# #регулярное выражение #захват #группа регулярных выражений

Вопрос:

Я хочу извлечь некоторые строковые данные из данного файла. Файл получил такую структуру, как:


name, catg, {y:2006, v:1000, c:100, vt:1}, {y:2007, v:1000, c:100, vt:1},.. {..}.. .


Я хочу извлечь следующие значения:

  • Имя;
  • catg;
  • числа после y , v , c , vt меток;

Я использовал следующие регулярные выражения:

  • @"(?<name>w ), (?<cat>w )" для извлечения первых двух элементов;
  • @"(?:{y:(?<y>d ), v:(?<v>d ), c:(?<c>d ), vt:(?<vt>d )}, ?) " для извлечения других значений, заключенных в фигурные скобки.

Я объединил эти два и выполнил тест в regex tester. Но, как и ожидалось, я получаю только один набор извлеченных чисел. И мне нужен результат из другой части ( {y:2007, v:1000, c:100, vt:1} ). Более того, там могло быть больше двух частей.

Как мне исправить мое регулярное выражение? И затем, как мне собрать все наборы чисел из соответствующих частей.

Ответ №1:

Здесь исправлено регулярное выражение (вам нужно указать параметр IgnorePatternWhitespace):

 (?'name'w ), s*
(?'category'w ), s*
(?:
    { s*
        y: (?'y'd ), s*
        v: (?'v'd ), s*
        c: (?'c'd ), s*
        vt: (?'vt'd )
    } s*
    ,? s*
)*
  

И вот использование:

 String input = @"name, catg, {y:2006, v:1000, c:100, vt:1}, {y:2007, v:1000, c:100, vt:1}";
String pattern =
      @"(?'name'w ), s*
        (?'category'w ), s*
        (?:
            { s*
                y: (?'y'd ), s*
                v: (?'v'd ), s*
                c: (?'c'd ), s*
                vt: (?'vt'd )
            } s*
            ,? s*
        )* ";
RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline;

Match match = Regex.Match(input, pattern, options);
if (match.Success)
{
    String name = match.Groups["name"].Value;
    String category = match.Groups["category"].Value;

    Console.WriteLine("name = {0}, category = {1}", name, category);

    for (Int32 i = 0; i < match.Groups["y"].Captures.Count;   i)
    {
        Int32 y = Int32.Parse(match.Groups["y"].Captures[i].Value);
        Int32 v = Int32.Parse(match.Groups["v"].Captures[i].Value);
        Int32 c = Int32.Parse(match.Groups["c"].Captures[i].Value);
        Int32 vt = Int32.Parse(match.Groups["vt"].Captures[i].Value);

        Console.WriteLine("y = {0}, v = {1}, c = {2}, vt = {3}", y, v, c, vt);
    }
}
  

Комментарии:

1. Хорошо! Как мне получить извлеченные группы?

2. @helicera, я только что добавил пример использования 🙂