Regex получить группу n из результатов группы

У меня есть результат запроса к базе данных:

IEnumerable<ResultRecord> results_from_db_call = Db.GoGetItNow();

Теперь предположим, что возвращенный класс выглядит так:

public class ResultsRecord
{
    public string DataBlob { get; set; }

    public int FirstID { get; set; }
    public int SecondNum { get; set; }
    public DateTime ThirdDate { get; set; }
    public string FourthTime { get; set; }
    public string FifthTime { get; set; }

}

Теперь возвращаемые записи результатов содержат только набор членов DataBlob.

Это вполне может выглядеть так:

<IK/12322>1354654  16/MAY/2014 18:01:01 - 20:01:01

Итак, мне нужно заполнить других членов, и я хотел бы сделать это с делегатом «Каждый»:

results.Each(f => f.FirstID = int.Parse(Regex.Match(f.DataBlob, @"\d+").Value));
results.Each(f => f.SecondNum = int.Parse(Regex.Match(f.DataBlob, @"\d+").Value));
results.Each(f => f.ThirdDate = DateTime.Parse(Regex.Match(f.DataBlob, @"\d+").Value));
results.Each(f => f.FourthTime = Regex.Match(f.DataBlob, @"\d+").Value));
results.Each(f => f.FifthTime = Regex.Match(f.DataBlob, @"\d+").Value));

Ну, как вы понимаете, это регулярное выражение работало только с первым целым числом.

Но ждать! У меня есть работающее регулярное выражение, чтобы найти все нужные мне группы:

(\d+)\>(\d+)  (\d+\/[a-zA-Z]+\/\d+) (\d+\:\d+\:\d+) - (\d+\:\d+\:\d+)

Это успешно группирует все элементы, которые мне нужны.

Но вот вопрос: как получить второй элемент группы регулярных выражений для SecondNum, третий элемент группы регулярных выражений для ThirdDate, четвертый элемент группы регулярных выражений для FourthTime и пятый элемент группы регулярных выражений для FifthTime?

Когда я пытаюсь

 (\d+)\>(\d+)  (\d+\/[a-zA-Z]+\/\d+) (\d+\:\d+\:\d+) - (\d+\:\d+\:\d+){0}

Я не получаю первый (нулевой) элемент.

Как я могу вызвать регулярное выражение, чтобы получить первый и т. д. элемент из групп?

results.Each(f => f.SecondNum = int.Parse(Regex.Match(f.DataBlob, @"????").Value));

person Robert Achmann    schedule 01.10.2014    source источник


Ответы (1)


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

string pattern = @"(\d+)\>(\d+)  (\d+\/[a-zA-Z]+\/\d+) (\d+\:\d+\:\d+) - (\d+\:\d+\:\d+)";
Match m = Regex.Match(f.DataBlob, pattern);
// You can then refer to the matched group this way:
// m.Groups[1] = 12322
// m.Groups[2] = 1354654
// ...etc
Group g = m.Groups[2];
// Then parse into integer

Обратите внимание, что группа захвата начинается с 1, а не с 0. Вы также можете взглянуть на пример здесь.

person Steven Xu    schedule 02.10.2014
comment
Невозможно использовать это в List‹Type› Obj.Each. Это было указано в вопросе. - person Robert Achmann; 02.10.2014
comment
На самом деле, ваш ответ заставил меня задуматься о том, насколько я был неэффективен... Теперь я делаю одно регулярное выражение в цикле всех элементов... но я мог бы вызвать: results.Each(f => f.SecondNum = int. Parse(Regex.Match(f.DataBlob, шаблон).Groups[2].Value)); - person Robert Achmann; 03.10.2014
comment
Я не знаком с языком, который вы используете. Я просто объяснял с точки зрения общего использования регулярных выражений, потому что вы вообще не использовали группы захвата, хотя вы их захватили. - person Steven Xu; 03.10.2014
comment
Я не уверен, что вы имеете в виду о группах? Каждый (бла-бла) — это группа, поэтому я снимаю группы. Что ты имеешь в виду? Я использую язык C#. - person Robert Achmann; 03.10.2014
comment
Да, кроме того, blaw blaw сохраняется в регулярном выражении как группа 1, если она первая. См. этот пример. Если вы видите середину правой панели «Информация о совпадении», ваши данные захватываются из групп с 1 по 5. В регулярном выражении они называются группами захвата, и для их использования вы просто используете \1 для ссылки на группу 1 и т. д. Синтаксис такой: разные среди языков. Для php это \1. $1 для JavaScript. И то, что я написал выше, для С#. Вы можете прочитать регулярное выражение perl для получения дополнительной информации. - person Steven Xu; 03.10.2014
comment
Я понял, что группы сохраняются, и что индекс основан на 1. Однако моя точка зрения заключалась в том, что я хотел сослаться на n-й элемент через само выражение регулярного выражения в качестве квалификатора совпадения, а не работать с результирующими группами захваченных элементов после завершения выражения регулярного выражения. Я хотел, чтобы однострочное выражение rexgex захватывало n-й элемент, в зависимости от состава выражения регулярного выражения. Теперь вы понимаете требования? - person Robert Achmann; 04.10.2014