2011-10-08 90 views
0

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

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正则表达式专家 - 任何帮助表示赞赏。

+0

你想要什么领域?这个例子中的领域应该是什么?数据如何变化? – TJR

+0

嗨TJ - 我想要日期,严重性,类名和行号,异常消息和转储文件。 –

回答

3

的问题是有点误导,因为它意味着需要 将日期解析为java.util.Date对象或类似物。真正的 的问题是如何将输入数据分割成所需的字段:

  • 日期
  • 水平
  • 位置名称&线
  • 异常名&消息
  • 转储文件

This是一个使用正则表达式的解决方案。

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" 
+0

谢谢TJR!那很棒! –

+0

如何使转储文件可选TJ? ()是()吗? –

+0

+“[] +(?:(?: Dump:)([a-zA-Z0-9 \\ ./] +))?” //转储 – TJR

2

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

1

如果要提取的日期(不包括时间戳)指出:

^\d{2}-\d{2}-\d{2} 
在Java

,它应该是

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

不解析使用正则表达式的日期。而是使用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(); 
     } 
     } 


    } 
} 
+0

但首先我需要获取解析出的日期对象。 –

+0

@AmirAfghani:查看编辑 –

1

您可以使用日期:

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