2013-05-17 5 views
-1

У меня есть набор журналов, содержащий сотни строк данных. Я хочу вывести данные между двумя встречами данной строки (например: «LOGS ARE CLEARED») и в течение определенного периода, указанного даты начала и окончания даты (например: «05/01/2013» - «05/17/2013")Вытяните данные только с одним регулярным выражением

Пример возможной строки:

113 * 05/01/2013 * 16: 10 1234 * 1 * (IW (1 * 0, М-00, R-100110021 А/C ЭКСПЛУАТАЦИЯ OK * 121 * 05/01/2013 * 16: 28 ОЖИДАЕТСЯ ОЖИДАЕМЫЙ 114 * 05/01/2013 * 16: 38 1234 * 1 * (Iw (1 * 0, M-00, R-100110021 A/C * 120 * 05/11/2013 * 18: 36 1234 * 1 * (Iw (1 * 1, M-00, R-100110021 A/C CUSTOMER * 126 * 05/12/2013 * 06: 12 1234 * 1 * (Iw (1 * 0, M-00, R-100110021 A/C ЭКСПЛУАТАЦИЯ OK * 130 * 05/18/2013 * 07: 37 1234 * 1 * (Iw (1 * 7, M-00, R-100110021 A/C BILLS * 134 * 05/18/2013 * 10: 44 БУМАГИ ИЗБРАННЫ 133 * 05/18/2013 * 13: 34 * 1234 * 1 * (Iw (1 * 0, M-00, R-100110021 A/C РАБОТА

Как это должно быть достигнуто с простой конструкцией в C# .net и может его может быть достигнуто только с ОДНОМ РЕГУЛЯРНЫМ ВЫРАЖЕНИЕМ?

+1

Вы должны привести пример строки, чтобы показать, где указаны даты –

+0

. Измените свой ответ и добавьте к нему новую информацию. Мы не можем читать так. Затем удалите комментарий. –

+0

@Storm: Если бы это было просто вопрос резки и вставки, я бы сам ее исправил. К сожалению, несколько символов теряются, потому что SO обрабатывает их как разметку. Только ОП знает, как должны выглядеть данные. –

ответ

0

Образец в вашем примере будет:

05/01/2013. БУМАГИ ОЧИСТЫВАЮТСЯ () БУМАГИ ОЧИСТКИ. * 05/17/2013

Однако я не могу представить себе менее эффективный способ сделать это. Он также терпит неудачу, если в журналах нет даты начала или даты окончания.

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

0

Попробуйте это:

string logContent = @"113*05/01/2013*16:10 1234*1*(Iw(1*0, M-00, R-100110021 A/C OPERATION OK *121*05/01/2013*16:28 LOGS ARE CLEARED 114*05/01/2013*16:38 1234*1*(Iw(1*0, M-00, R-100110021 A/C *120*05/11/2013*18:36 1234*1*(Iw(1*1, M-00, R-100110021 A/C CUSTOMER *126*05/12/2013*06:12 1234*1*(Iw(1*0, M-00, R-100110021 A/C OPERATION OK *130*05/18/2013*07:37 1234*1*(Iw(1*7, M-00, R-100110021 A/C BILLS *134*05/18/2013*10:44 LOGS ARE CLEARED 133*05/18/2013*13:34 *1234*1*(Iw(1*0, M-00, R-100110021 A/C OPERATION"; 

Regex reg = new Regex(@"(?s)(?<start>\d{2}/\d{2}/\d{4})\*\d{2}:\d{2} LOGS ARE CLEARED(?<content>.*?)\s*\*?\d+\*(?=(?<end>\d{2}/\d{2}/\d{4})\*\d{2}:\d{2} LOGS ARE CLEARED)"); 
MatchCollection mc = reg.Matches(logContent); 

foreach (Match m in mc) { 
    Console.WriteLine("start date: " + m.Groups["start"]); 
    Console.WriteLine("content: " + m.Groups["content"]); 
    Console.WriteLine("end date: " + m.Groups["end"]); 
} 
Console.Read(); 
0

Попробуйте эту модель:. (? < = 05/01/2013).?

(? < = Бревна CLEARED) * + (= 05/12 /2013).*?(?=LOGS ALE CLEARED)

Вам нужно избежать косых черт в датах. Не знаю, почему \ dont придумать, когда я отправляю сообщение.

В случае, если даты там, требуется «между собой», «LOGS ALE CLEARED».

+1

Пожалуйста, используйте превосходные возможности форматирования кода этого сайта ([ref] (http://stackoverflow.com/editing-help)). Тогда вам не придется беспокоиться о том, что обратная косая черта не отображается. Кстати, '/' does ** не ** необходимо экранировать. –

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