Содержит ли текст формат даты? - PullRequest
0 голосов
/ 14 января 2020

Предположим, у меня есть этот текст:

how are you? ok, I'm fine and how are you 08-01-20. Nice.

Как проверить, содержит ли он подстроку в указанном формате c? В данном случае это формат даты: dd-MM-yy

 how are you? ok, I'm fine and how are you 08-01-20. Nice.  

В этом случае должно возвращаться 08-01-20.

Но этот текст:

 how are you? ok, I'm fine and how are you 18:01:21. Nice.

должен возвращать null .

Поэтому мне нужен метод, который возвращает 08-01-20 в первом случае и возвращает ноль во втором случае.

1 Ответ

5 голосов
/ 14 января 2020

Вы можете использовать совпадение с регулярным выражением .*?\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 вернет первую действительную дату в вашей дате

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...