Разбор значений из отформатированной строки в C # - PullRequest
3 голосов
/ 03 февраля 2010

Как я могу разобрать несколько значений из отформатированной строки в C #?

Строка в следующем формате: "бла-бла-бла (фу: это, бар: это)"

Мне нужно разобрать значение foo и bar. Круглые скобки всегда в конце строки.

Редактировать: Извините ... это было не очень ясно. Я имел в виду, что мне нужно знать значение «foo» и значение «bar», чтобы я мог где-то сказать «foo is this» и «bar is that».

Спасибо

Ответы [ 4 ]

1 голос
/ 03 февраля 2010

РЕДАКТИРОВАТЬ: обновляется после уточнения ОП.

Это должно сделать:

string input = "blah blah blah (foo:this, bar:that,1:one,2:two)";
string pattern = @"\((?:(?<Values>.*?:[^,\s]+)[,\s]*)+\)";
foreach (Match m in Regex.Matches(input, pattern))
{
    foreach (Capture c in m.Groups["Values"].Captures)
    {
        string[] values = c.Value.Split(':');
        Console.WriteLine("{0} : {1}", values[0], values[1]);
    }
}

Это выводит:

  • foo: это
  • бар: тот
  • 1: один
  • 2: два

Если вам нужно убедиться, что сопоставление происходит только в конце строки, а не совпадать с аналогичными форматированными значениями в других местах строки, добавьте $ в конец шаблона:

string pattern = @"\((?:(?<Values>.*?:[^,\s]+)[,\s]*)+\)$";
0 голосов
/ 03 февраля 2010

Что касается .NET, вы можете использовать такие захваты:

> $s = "blah blah blah (foo:this, bar:that)"
> $result = [regex]::Match($s, '[^(]*\((?:\w+:(?<t>\w+),\s*)*\w+:(?<t>\w+)\)$')
> $result.Groups

Groups   : {blah blah blah (foo:this, bar:that), that}
Success  : True
Captures : {blah blah blah (foo:this, bar:that)}
Index    : 0
Length   : 35
Value    : blah blah blah (foo:this, bar:that)

Success  : True
Captures : {this, that}
Index    : 30
Length   : 4
Value    : that

> $result.Groups[1].captures
Index                                          Length Value
-----                                          ------ -----
20                                               4 this
30                                               4 that

это код в PowerShell.Однако PowreShell основан на .NET, поэтому он должен работать в .NET.

Выражение синтаксического анализа основано на опубликованном вами примере, поэтому оно пропускает все до ( и затем начинает синтаксический анализ значений.Обратите внимание, что (?:..) - это группа без захвата, поэтому она не отображается в результатах.

0 голосов
/ 03 февраля 2010

Я делаю довольно много предположений здесь на основе вашего вопроса, но это должно привести вас в правильном направлении.

#!/usr/bin/perl

my $input = "blah blah blah (foo:this, bar:that, foo2:150)";

my @ray = ($input =~ /.*?:(\w*)/g);
foreach $x (@ray)
{
    print "Value: '$x'\n";
}

Выход:

Value: 'this'
Value: 'that'
Value: '150'
0 голосов
/ 03 февраля 2010

Регулярные выражения не должны использоваться для синтаксического анализа, если это возможно, только лексизация. Передайте лексированные токены в конечный автомат для фактического анализа.

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