我需要帮助创建一个解析以下字符串的正则表达式:
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 :(得分: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