文字是否包含日期格式?

时间:2020-01-14 13:32:05

标签: java string date kotlin

假设我有这段文字:

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

如何检查它是否包含特定格式的子字符串?在这种情况下,这是日期格式: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.

必须返回

因此,我需要第一种情况下返回08-01-20并在第二种情况下返回 null 的方法。

1 个答案:

答案 0 :(得分:5)

您可以像这样将match与正则表达式.*?\d{2}-\d{2}-\d{2}.*配合使用:

t

修改

OP编辑后,可以使用预览正则表达式提取日期,然后使用格式化程序检查日期是否有效,如果是则返回日期,否则返回null:

".*?\\d{2}-\\d{2}-\\d{2}.*".toRegex().matches(str)

选中kotlin demo

或者,如果您想获得相同的值而不是LocalDate,则可以将提取的日期作为String返回,如下所示:

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;
    }
}

注意:在第二部分中,我更改了正则表达式,并使用边界避免了诸如321-12-4321之类的情况

修改

@Andreas在评论中提出了一个很好的观点,因此,如果您有许多使用该格式的日期,并且其中至少一个有效,那么在这种情况下,您必须遍历所有匹配项,并逐个检查,如下所示:

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;
    }
}

这将返回您日期中的第一个有效日期