Строка даты регулярного выражения Java - PullRequest
1 голос
/ 09 октября 2011

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

09-22-11 12:58:40       SEVERE       ...ractBlobAodCommand:104           -   IllegalStateException: version:1316719189017 not found in recent history                             Dump: /data1/aafghani/dev/devamir/logs/dumps/22i125840.dump

Самое сложное для меня - это разбор даты. Я не очень разбираюсь в регулярных выражениях Java - любая помощь приветствуется.

Ответы [ 5 ]

4 голосов
/ 09 октября 2011

Вопрос немного вводит в заблуждение, поскольку подразумевает необходимость разобрать дату в java.util.Date объект или аналогичный. Реальный Вопрос в том, как разбить входные данные на нужные поля:

  • дата
  • уровень
  • название места и линия
  • имя исключения и сообщение
  • файл дампа

Это одно решение с использованием регулярного выражения.

String pattern = "^(\\d{2}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})" // date
    + "[ ]+(SEVERE|WARNING|INFO|CONFIG|FINE|FINER|FINEST)" // level
    + "[ ]+([^:]+):(\\d+)" // location name, location line
    + "[ ]+-[ ]+([^:]+): (.*?)" // exception name, exception message
    + "[ ]+Dump: ([a-zA-Z0-9\\./]+)" // dump
    + "$";

Pattern regex = Pattern.compile(pattern);
String input = "09-22-11 12:58:40       SEVERE       ...ractBlobAodCommand:104           -   IllegalStateException: version:1316719189017 not found in recent history                             Dump: /data1/aafghani/dev/devamir/logs/dumps/22i125840.dump";
Matcher m = regex.matcher(input);
assertTrue(m.matches());
assertSame(7, m.groupCount());
for (int i = 1; i <= m.groupCount(); i++) {
  System.out.format("[%d] \"%s\"%n", i, m.group(i));
}

выход

[1] "09-22-11 12:58:40"
[2] "SEVERE"
[3] "...ractBlobAodCommand"
[4] "104"
[5] "IllegalStateException"
[6] "version:1316719189017 not found in recent history"
[7] "/data1/aafghani/dev/devamir/logs/dumps/22i125840.dump"
3 голосов
/ 09 октября 2011

Не разбирайте дату с помощью регулярных выражений. Вместо этого используйте объект SimpleDateFormat.

например.,

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Foo001 {
   public static void main(String[] args) {
      String test = "    09-22-11 12:58:40       SEVERE       ...ractBlobAodCommand:104           -   IllegalStateException: version:1316719189017 not found in recent history                             Dump: /data1/aafghani/dev/devamir/logs/dumps/22i125840.dump";

      Pattern pattern = Pattern.compile("(?<=^\\s+)\\d[\\d -:]+\\d+(?=\\s+)");
      Matcher matcher = pattern.matcher(test);
      if (matcher.find()) {
         String dateString = matcher.group();

         SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yy HH:mm:ss");

         try {
            Date date = sdf.parse(dateString);
            System.out.println(date);
         } catch (ParseException e) {
            e.printStackTrace();
         }
      }


   }
}
2 голосов
/ 09 октября 2011

Вы уверены, что это то, что вам нужно? Я хотел бы разделить строку на разделители или столбцы и использовать существующие библиотеки разбора даты для выполнения тяжелой работы.

1 голос
/ 09 октября 2011

Вы можете использовать для даты:

^ \ d \ d- \ d \ d- \ d \ d

1 голос
/ 09 октября 2011

, если вы хотите извлечь дату (без метки времени):

^\d{2}-\d{2}-\d{2}

в Java, это должно быть

String regex = "^\\d{2}-\\d{2}-\\d{2}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...