Вы можете использовать совпадение с регулярным выражением .*?\d{2}-\d{2}-\d{2}.*
примерно так:
".*?\\d{2}-\\d{2}-\\d{2}.*".toRegex().matches(str)
Редактировать
После редактирования OP, Вы можете извлечь дату с помощью регулярного выражения предварительного просмотра, а затем использовать средство форматирования, чтобы проверить, является ли дата действительной или нет, если да, вернуть ее, иначе вернуть ноль:
fun check(str: String): LocalDate? {
var formatter = DateTimeFormatter.ofPattern("dd-MM-yy");
var v = str.replace(".*?(\\b\\d{2}-\\d{2}-\\d{2}\\b).*".toRegex(), "$1");
try{
return LocalDate.parse(v, formatter);
}catch(e: DateTimeParseException) {
return null;
}
}
Проверить kotlin демо
Или, если вы хотите получить то же значение, а не LocalDate, вы можете вернуть извлеченную дату в виде строки следующим образом:
fun check(str: String): String? {
var formatter = DateTimeFormatter.ofPattern("dd-MM-yy");
var v = str.replace(".*?(\\b\\d{2}-\\d{2}-\\d{2}\\b).*".toRegex(), "$1");
try{
LocalDate.parse(v, formatter);
return v;
}catch(e: DateTimeParseException) {
return null;
}
}
Примечание: во второй части I изменил регулярное выражение, и я использовал границы, чтобы избежать некоторых случаев, таких как 321-12-4321
Edit
@ Andreas поставил хорошую точку в комментарии, поэтому если у вас много дат с этим форматом, и хотя бы одна из них действительна, в этом случае вам нужно l oop для всех совпадений и проверить одну за другой следующим образом:
fun check(str: String): LocalDate? {
var formatter = DateTimeFormatter.ofPattern("dd-MM-yy")
val regex = Regex("\\b\\d{2}-\\d{2}-\\d{2}\\b")
for (match in regex.findAll(str)) {
try{
return LocalDate.parse(match.value, formatter);
}catch(e: DateTimeParseException) { }
}
return null
}
This вернет первую действительную дату в вашей дате