0

我有这个带有 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:这是一个虚拟 DCS 错误消息”。这部分来自字符串并忽略所有异常堆栈跟踪。

我在想,如果我得到日期的索引,我可以做一个从索引 0 到日期索引的子字符串。

我不擅长正则表达式,所以没有尝试过任何东西。提前致谢。

4

2 回答 2

2

假设时间戳是正确的标记,您可以尝试将其与以下所有内容一起剥离:

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.
于 2021-10-05T16:52:21.020 回答
1

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

start()方法为您提供匹配开始的Matcher索引,即第一个匹配的字符。有一个相应的end方法可以给我们匹配最后一个字符之后的偏移量。

但是,如果您想要的只是消息,那将是绕道而行。

于 2021-10-05T20:32:28.573 回答