#java
Вопрос:
У меня есть эта строка с ГГГГ-ММ-ДД ЧЧ:ММ:СС формат даты и времени, как показано ниже:
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 в индекс даты.
Я плохо разбираюсь в регулярных выражениях, поэтому ничего не пробовал. Заранее спасибо.
Ответ №1:
Предположив, что метка времени является правильным маркером, вы можете попробовать удалить ее вместе со всем следующим контентом:
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.
Комментарии:
1. Деталь, так как мы ожидаем только одну замену, я бы предпочел
replaceFirst()
replaceAll()
. В любом случае это хорошее решение.
Ответ №2:
Простой код Тима Бигелейзена, по-видимому, лучше всего подходит для достижения вашей реальной цели: извлечь сообщение до даты.
Поскольку вы спросили индекс даты, для полноты я хотел показать вам, что для этого тоже можно использовать регулярное выражение:
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
метод, дающий нам смещение после совпадения последнего символа.
Однако это обходной путь, если все, что вам нужно, — это сообщение.
Комментарии:
1. Преимущество использования этого решения заключается в том, что с помощью него также можно получить дату и время
m.group()
.