我有一个YYYY-MM-DD HH:MM:SS日期和时间格式的字符串,格式如下:
String JAVA_STACK_TRACE = "ABC-007: This is a dummy ABC error message. This message can have multiple sentences." + " 2021-09-24 19:12:50,672 Exception in thread "main" java.lang.RuntimeException: A test exception" + " at com.stackify.stacktrace.StackTraceExample.methodB(StackTraceExample.java:13)" + " at com.stackify.stacktrace.StackTraceExample.methodA(StackTraceExample.java:9)" + " at com.stackify.stacktrace.StackTraceExample.main(StackTraceExample.java:5)";
我想从字符串中提取"ABC-007: This is a dummy DCS error message.">这部分并忽略所有异常堆栈跟踪。
我在想如果我得到日期的索引,我可以做一个从索引0到日期索引的子字符串。
我不擅长正则表达式,所以没有尝试任何东西。提前谢谢。
假设时间戳是正确的标记,您可以尝试将其与以下所有内容一起剥离:
String output = JAVA_STACK_TRACE.replaceAll("\s+\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.*$", "");
System.out.println(output);
这个打印:
ABC-007: This is a dummy ABC error message. This message can have multiple sentences.
Tim Biegeleisen的简单代码似乎是获得您真正目标的最佳方法:提取日期之前的消息。
既然您要求日期的索引,为了完整性,我想向您展示正则表达式也可以用于此:
Pattern p = Pattern.compile("\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3}");
Matcher m = p.matcher(JAVA_STACK_TRACE);
if (m.find()) {
int indexOfDateAndTime = m.start();
System.out.println("Index: " + indexOfDateAndTime);
} else {
System.out.println("Not found");
}
输出:
指数:86
Matcher
的start()
方法给出了匹配开始位置的索引,即第一个匹配的字符。有一个相应的end
方法给出了最后一个字符匹配后的偏移量。
如果你想要的只是信息,这是一个弯路。