Алгоритм соответствия или регулярное выражение? - PullRequest
1 голос
/ 13 апреля 2011

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

Пример фрагмента:

2011-03-05 node32_three INFO stack trace, at empty string asfa 11120023
--- - MON 23 02 2011 ERROR stack trace NONE      

Например, каков наилучший способ извлечь дату из каждой строки, независимо от формата даты?

Ответы [ 2 ]

3 голосов
/ 13 апреля 2011

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

 (fmt1)|(fmt2)|....

Где fmt1 , fmt2 и т. Д. Являются отдельными регулярными выражениями, например,

(20\d\d-[01]\d-[0123]\d)|((?MON|TUE|WED|THU|FRI|SAT|SUN) [0123]\d [01]\d 20\d\d)

Обратите внимание, что для предотвращения возможности совпадения произвольных чисел я ограничил номера года, месяца и дня соответственно.Например, номер дня не может начинаться с 4, номер месяца также не может начинаться с 2.

Это дает следующий псевдокод:

// remember that you need to double each backslash when writing the
// pattern in string form
Pattern p = Pattern.compile("...");    // compile once and for all
String s;
for each line 
    s = current input line;
    Matcher m = p.matcher(s);
    if (m.find()) {
        String d = m.group();    // d is the string that matched
        ....
    }

Каждый отдельный шаблон даты записывается в (), чтобы можно было выяснить, какой у нас был формат, например:

        int fmt = 0;
        // each (fmt) is a group, numbered starting with 1 from left to right
        for (int i = 1; fmt == 0 && i <= total number of different formats; i++) 
            if (m.group(i) != null) fmt = i;

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

1 голос
/ 18 апреля 2011

Если вы используете Java, вы можете взглянуть на Время Joda .Также прочитайте этот вопрос и связанные с ним ответы .Я думаю, что Joda DateTimeFormat должна предоставить вам всю необходимую гибкость для анализа различных форматов даты / времени вашего файла журнала.

Быстрый пример:

String dateString = "2011-04-18 10:41:33";
DateTimeFormatter formatter = 
  DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTime dateTime = formatter.parseDateTime(dateString);

Просто определите String[] для форматов вашей даты / времени и передайте каждый элемент в DateTimeFormat, чтобы получить соответствующий DateTimeFormatter.Вы можете использовать регулярное выражение, просто отделяя строки даты от других элементов в строках журнала, а затем вы можете использовать различные DateTimeFormatter s, чтобы попытаться проанализировать их.

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