2014-10-01 2 views
0

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

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)); 

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

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

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

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

Но вот вопрос, как получить второй элемент группы регулярных выражений для SecondNum, третьего элемента группы регулярных выражений для третьего элемента, четвертого элемента группы регулярных выражений для 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)); 

ответ

-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 

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

+0

Невозможно использовать это в списке Obj.Each. Об этом говорилось в этом вопросе. –

+0

На самом деле, ваш ответ заставлял меня думать о том, насколько эффективным я не был ... Теперь я делаю одно регулярное выражение в цикле всех элементов ... но я мог бы вызвать: results.Each (f => f.SecondNum = int .Parse (Regex.Match (f.DataBlob, pattern) .Groups [2] .Value)); –

+0

Я не знаком с используемым вами языком. Я просто объяснял с точки зрения общего использования регулярных выражений, потому что вы вообще не использовали группы захвата, хотя вы их захватили. –

Смежные вопросы