Извлечь числовые значения, заключенные в фигурные скобки - PullRequest
1 голос
/ 28 мая 2011

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


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


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

  • имя *; 1011 *
  • CATG;
  • цифры после y, v, c, vt меток;

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

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

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

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

1 Ответ

1 голос
/ 28 мая 2011

Вот фиксированное регулярное выражение (вам нужно указать опцию 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);
    }
}
...