You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android:如何从动态前缀的文件名中提取日期、时间及手机号

嘿,这个需求在Android里很好解决,我给你两种实用的方案,根据你的实际场景选就行:

方法一:字符串分割法

从你的示例文件名能看出来,结构是[动态前缀]_[日期]_[时间]_[手机号]_[随机数字].mp3,所有部分都用下划线分隔,而且日期、时间、手机号的位置是固定的(第2、3、4段)。这种情况下,字符串分割法简单又高效:

步骤很清晰:

  • 先去掉文件名的.mp3后缀
  • 用下划线把字符串分割成数组
  • 直接从数组里取对应位置的元素就行

Java 代码示例

String fileName = "Unregistered_2018-05-02_14.40.04_+621241411112_34243555523.mp3";
// 移除文件后缀
String nameWithoutExt = fileName.substring(0, fileName.lastIndexOf("."));
// 按下划线分割成数组
String[] segments = nameWithoutExt.split("_");

// 要确保分割后的数组长度足够,避免数组越界异常
if (segments.length >= 5) {
    String date = segments[1];       // 提取到:2018-05-02
    String time = segments[2];       // 提取到:14.40.04
    String phoneNumber = segments[3];// 提取到:+621241411112
    
    // 这里可以加入你的业务逻辑
    Log.d("FileParser", String.format("Date: %s, Time: %s, Phone: %s", date, time, phoneNumber));
} else {
    // 处理不符合格式的文件名
    Log.e("FileParser", "文件名格式不符合预期");
}

Kotlin 代码示例

val fileName = "Martin_2018-04-01_03.10.40_+111_5213441935.mp3"
// 移除文件后缀
val nameWithoutExt = fileName.substringBeforeLast(".")
// 按下划线分割成列表
val segments = nameWithoutExt.split("_")

if (segments.size >= 5) {
    val date = segments[1]
    val time = segments[2]
    val phoneNumber = segments[3]
    
    Log.d("FileParser", "Date: $date, Time: $time, Phone: $phoneNumber")
} else {
    Log.e("FileParser", "文件名格式不符合预期")
}
方法二:正则表达式法

如果你的动态前缀里可能包含下划线(比如出现John_Doe_2024-01-01_...这种情况),字符串分割法就会失效,这时正则表达式是更稳妥的选择。我们可以根据日期、时间、手机号的格式写一个精准匹配的正则:

正则表达式:^.*?_(\d{4}-\d{2}-\d{2})_(\d{2}\.\d{2}\.\d{2})_([+]\d+)_.*?\.mp3$

简单解释下正则各部分:

  • ^.*?_:匹配开头任意内容直到第一个下划线(跳过动态前缀)
  • (\d{4}-\d{2}-\d{2}):捕获日期(格式:4位年-2位月-2位日)
  • _(\d{2}\.\d{2}\.\d{2}):捕获时间(格式:2位小时.2位分钟.2位秒)
  • _([+]\d+):捕获手机号(以+开头,后面跟任意数字)
  • _.*?\.mp3$:匹配剩余内容直到结尾的.mp3

Java 代码示例

String fileName = "Byan_2018-01-04_04.70.01_+62994_2313325553.mp3";
Pattern pattern = Pattern.compile("^.*?(\\d{4}-\\d{2}-\\d{2})_(\\d{2}\\.\\d{2}\\.\\d{2})_([+]\\d+)_.*?\\.mp3$");
Matcher matcher = pattern.matcher(fileName);

if (matcher.find()) {
    String date = matcher.group(1);       // 提取到:2018-01-04
    String time = matcher.group(2);       // 提取到:04.70.01
    String phoneNumber = matcher.group(3);// 提取到:+62994
    
    Log.d("FileParser", String.format("Date: %s, Time: %s, Phone: %s", date, time, phoneNumber));
} else {
    Log.e("FileParser", "未匹配到符合格式的内容");
}

Kotlin 代码示例

val fileName = "Byan_2018-01-04_04.70.01_+62994_2313325553.mp3"
val regex = "^.*?(\\d{4}-\\d{2}-\\d{2})_(\\d{2}\\.\\d{2}\\.\\d{2})_([+]\\d+)_.*?\\.mp3$".toRegex()
val matchResult = regex.find(fileName)

matchResult?.let {
    val date = it.groupValues[1]
    val time = it.groupValues[2]
    val phoneNumber = it.groupValues[3]
    
    Log.d("FileParser", "Date: $date, Time: $time, Phone: $phoneNumber")
} ?: run {
    Log.e("FileParser", "未匹配到符合格式的内容")
}

方案选择建议

  • 如果确定动态前缀不会包含下划线,优先用字符串分割法,代码更简洁,性能也更好
  • 如果前缀可能有下划线,或者需要更严格的格式校验,就用正则表达式法

内容的提问来源于stack exchange,提问作者Kitereative Indonesia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:35:33