Java regexp date string
I need help creating a regular expression that will parse the following string :
09-22-11 12:58:40 SEVERE 开发者_JAVA技巧 ...ractBlobAodCommand:104 - IllegalStateException: version:1316719189017 not found in recent history Dump: /data1/aafghani/dev/devamir/logs/dumps/22i125840.dump
The most difficult part for me is parsing out the date. I'm not really an expert on Java regular expressions - any help is appreciated.
The question is a bit misleading as it implies the need to parse the date into
java.util.Date
object or similar. The real question is how to split up the input data into the desired fields:
- date
- level
- location name & line
- exception name & message
- dump file
This is one solution using a regular expression.
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));
}
Output
[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"
Don't parse a date with regular expressions. Instead use a SimpleDateFormat object.
e.g.,
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();
}
}
}
}
Are you sure that's what you need? I'd consider splitting the string on delimiters or columns and using existing date parsing libs to do the heavy lifting.
if you want to extract the date (without timestamp) out:
^\d{2}-\d{2}-\d{2}
in java, it should be
String regex = "^\\d{2}-\\d{2}-\\d{2}"
You can use for the date:
^\d\d-\d\d-\d\d
精彩评论