假设我有这段文字:
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 的方法。
答案 0 :(得分:5)
您可以像这样将match与正则表达式.*?\d{2}-\d{2}-\d{2}.*
配合使用:
t
修改
OP编辑后,可以使用预览正则表达式提取日期,然后使用格式化程序检查日期是否有效,如果是则返回日期,否则返回null:
".*?\\d{2}-\\d{2}-\\d{2}.*".toRegex().matches(str)
或者,如果您想获得相同的值而不是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;
}
}
这将返回您日期中的第一个有效日期