如何修正正则表达式以提取字符串中的HH:MM格式时分部分
现有写法的问题
你的代码有两个核心错误:
- 正则开头的
^锚定了字符串起始位置,而你需要的时分片段在字符串中间,所以根本匹配不到目标内容 - 你的逻辑是把匹配到的内容替换为空,和「保留时分、删除其余内容」的需求完全相反
可行实现方案
方案1:全量匹配替换(兼容你原有replace写法)
正则匹配整个字符串,把时分部分单独捕获,替换时只保留捕获分组的内容:
println("Thu Dec 31 22:00:00 UYST 2009".replace(""".*?(\d{2}:\d{2}):\d{2}.*""".toRegex(), "$1"))
正则说明:
.*?非贪婪匹配时间前面的所有内容(\d{2}:\d{2})捕获两位小时+冒号+两位分钟的目标内容,存入分组1:\d{2}匹配紧随其后的秒数部分,避免误匹配.*匹配时间后面的所有内容- 替换为
$1就是直接取分组1的时分内容
方案2:直接匹配提取时分(逻辑更直观)
如果不需要强制用replace实现,直接查找匹配目标片段更简单:
val result = """\d{2}:\d{2}(?=:\d{2})""".toRegex() .find("Thu Dec 31 22:00:00 UYST 2009") ?.value println(result)
正则说明:
(?=:\d{2})是正向预查,只会匹配后面紧跟着:两位数字(也就是秒数)的xx:xx片段,精准定位到时分部分,不会匹配字符串里其他可能出现的时间格式。
内容的提问来源于stack exchange,提问作者Matias Barrios
相关产品推荐
相关产品推荐

