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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:58:40