Java字符串格式化:如何按规则转换特定格式的字符串?
如何在Java中实现指定的字符串格式化转换?
刚好做过类似的需求,我来一步步给你拆解怎么实现这个转换:
核心思路
我们需要把原始字符串拆分成「文件名+扩展名」「城市」「时间」三个部分,然后提取出城市、扩展名,再根据城市和时间生成编号,最后拼接成目标格式。
具体步骤&代码实现
首先处理原始字符串的拆分和各部分提取,再解决编号的问题(比如你例子里的02,应该是同一城市、同一日期下的照片序号对吧?)
1. 基础拆分与提取
先写一个完整的方法,把原始字符串里的关键信息拆出来并生成目标文件名:
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.Map; public class PhotoRenamer { // 用静态Map记录每个城市+日期的照片计数,用来生成编号 private static final Map<String, Integer> cityDateCounter = new HashMap<>(); public static String convertPhotoFileName(String originalStr) { try { // 第一步:拆分原始字符串为三个部分 String[] parts = originalStr.split(","); if (parts.length != 3) { throw new IllegalArgumentException("原始字符串格式不符合要求"); } // 提取扩展名:从第一部分拆分出后缀,注意去掉空格 String nameWithExt = parts[0].trim(); String[] nameExtSplit = nameWithExt.split("\\."); String extension = nameExtSplit[nameExtSplit.length - 1].trim(); // 提取城市名称 String city = parts[1].trim(); // 解析拍摄时间:注意格式里的月份是MM(大写),mm代表分钟别搞混 DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime shootTime = LocalDateTime.parse(parts[2].trim(), timeFormatter); String dateKey = city + shootTime.toLocalDate(); // 用城市+日期作为计数标识 // 生成两位数字的编号 int count = cityDateCounter.getOrDefault(dateKey, 0) + 1; cityDateCounter.put(dateKey, count); String numberStr = String.format("%02d", count); // 转成01、02这样的两位格式 // 拼接最终文件名 return city + numberStr + "." + extension; } catch (Exception e) { System.err.println("处理字符串时出错:" + e.getMessage()); return null; } } // 测试示例 public static void main(String[] args) { String test1 = "photo. jpg, Warsaw, 2013-09-05 14:08:15"; String test2 = "pic.png, Warsaw, 2013-09-05 15:30:00"; String test3 = "img.gif, Paris, 2024-01-10 09:15:45"; System.out.println(convertPhotoFileName(test1)); // 输出 Warsaw01.jpg System.out.println(convertPhotoFileName(test2)); // 输出 Warsaw02.jpg System.out.println(convertPhotoFileName(test3)); // 输出 Paris01.gif } }
2. 关键细节说明
- 字符串拆分:用
split(",")拆分后必须用trim()去掉每个部分的前后空格,不然会拿到带空格的城市名或者扩展名(比如例子里的" jpg")。 - 时间解析:格式字符串里的
MM对应月份,mm对应分钟,千万别写错!如果原始字符串里的yyyy-mm-dd是笔误(实际指月份),一定要换成MM才能正确解析。 - 编号生成:我用静态
HashMap记录每个城市+日期的照片数量,每次处理就把计数加1,再用String.format("%02d", count)保证编号是两位数字格式。如果你的编号规则是同一城市所有照片的总计数,只需要把dateKey改成单独的城市名就行。
3. 异常处理
代码里加了try-catch块处理格式错误的情况,比如原始字符串不是三个部分、时间格式不对等,避免程序崩溃,你可以根据自己的需求调整异常处理逻辑。
内容的提问来源于stack exchange,提问作者KKasi
相关产品推荐
相关产品推荐

