Java正则表达式日期字符串

时间:2011-10-08 21:37:55

标签: java regex

我需要帮助创建一个解析以下字符串的正则表达式:

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 个答案:

答案 0 :(得分:4)

  

这个问题有点误导,因为它意味着需要   将日期解析为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"

答案 1 :(得分:3)

不要使用正则表达式解析日期。而是使用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 :(得分:2)

你确定这是你需要的吗?我会考虑在分隔符或列上拆分字符串,并使用现有的日期解析库来完成繁重的工作。

答案 3 :(得分:1)

如果你想提取日期(没有时间戳):

^\d{2}-\d{2}-\d{2}
在java中,它应该是

String regex = "^\\d{2}-\\d{2}-\\d{2}"

答案 4 :(得分:1)

您可以使用日期:

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