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
相关产品推荐
相关产品推荐

