根据通配符修改文件名


今天项目上有个需要,是要根据指定的通配符匹配需要修改的文件,并根据给出的通配符实现改名

Java替换Word模板 java替换文件名_文件名


需求如下:

Java替换Word模板 java替换文件名_List_02


拿到需求时,我们首先要构思好如何实现这个功能,应该分几步完成,而不是盲目的进行编码。

这个需要大致可以分成两部分,第一部分就是先判断文件名是否符合匹配通配符的规则,第二部分是将匹配的这一部分的文件名根据改名通配符进行改名。

从上面的需要截图我们可知“ * ”和“?”配置的数据需要保留下来其余的要改变,这个有很多种方式可以实现,以下我们通过将“ * ”和“?”匹配上的数据抠出来放到list集合中再拼接到改名通配符的方式来实现,下面是具体的代码实现,(如有不妥的地方还请指出,以供改进):

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
 * 更改文件名字工具类
 * @author  欧绪勇
 * @since 2019-12-26
 */
public class Test3 {
    public static void main(String[] args) {
        //文件名
      String filename ="123456789.txt";
      //匹配通配符
      String rule ="123*6?8*.txt";
        //改名通配符
      String replaceFilename ="abc*d?f*.txt";
      List<Object> starList =  new ArrayList<>();
      List<Object> questionList =  new ArrayList<>();
       boolean bool= isMatch(filename,rule,starList,questionList);
        System.out.println("文件名与 匹配通配符匹配结果: "+bool);
       System.out.println(" “*”号匹配到的数据 "+starList.toString()+" “?”号匹配到的数据 "+questionList.toString());
       if(bool){
           String str= replace(starList,questionList,replaceFilename);
           System.out.println("匹配需要改名的文件通配符 "+rule);
           System.out.println("改名前的文件名 "+filename);
           System.out.println("改名通配符 "+replaceFilename);
           System.out.println("改名后的文件名 "+str);
       }
    }

    /**
     * 匹配文件名是否符合通配符,并保存匹配到字符串
     * @param filename  文件名
     * @param rule   匹配文件通配符
     * @param starList  保存通配符“*”匹配到的数据
     * @param questionList 保存通配符“?”匹配到的数据
     * @return
     */
    public static boolean isMatch(String filename, String rule, List<Object> starList,List<Object> questionList) {
        int ns = filename.length();
        int np = rule.length();
        if(np == 0) {
            return ns == 0;
        }
        if(ns == 0) {
            for (int i = 0; i < np; i++) {
                if(rule.charAt(i) != '*') {
                    return false;
                }
            }
            return true;
        }
        if(rule.charAt(np - 1) == '?'){
            if(rule.length() <= filename.length()){
                if(isMatch(filename.substring(0, ns - 1), rule.substring(0, np - 1),new ArrayList<>(),new ArrayList<>())){
                    questionList.add(filename.charAt(ns - 1));
                }
            }
            return isMatch(filename.substring(0, ns - 1), rule.substring(0, np - 1),starList,questionList);
        }
        if(filename.charAt(ns - 1) == rule.charAt(np - 1)) {
            return isMatch(filename.substring(0, ns - 1), rule.substring(0, np - 1),starList,questionList);
        }
        if(rule.charAt(np - 1) == '*') {
            for (int i = 0; i <= ns; i++) {
                if(isMatch(filename.substring(0, i), rule.substring(0, np - 1),starList,questionList)) {
                    starList.add(filename.substring(i));
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 根据改名通配符更改文件名字
     * @param starList 通配符“*”匹配到的数据
     * @param questionList 通配符“?”匹配到的数据
     * @param replaceFilename 文件改名规则通配符
     * @return
     */
    public static String replace(List<Object> starList ,List<Object> questionList ,String replaceFilename){
        //将questionList倒叙赋给新的list
        List<Object> newQuestionList = new ArrayList<>();
        for(int i =questionList.size()-1;i >= 0;i--){
            newQuestionList.add(questionList.get(i));
        }
        if(replaceFilename.indexOf("*") == -1 && replaceFilename.indexOf("?") == -1){
            return replaceFilename;
        }
        StringBuffer stringBuffer = new StringBuffer(replaceFilename);
        //如果改名通配符包含“*”号
        if(replaceFilename.indexOf("*") != -1){
            stringBuffer= jointString(replaceFilename,starList,"*",stringBuffer);
        }
        //如果改名通配符包含“?”号
        if(replaceFilename.indexOf("?") != -1){
            stringBuffer= jointString(replaceFilename,newQuestionList,"?",stringBuffer);
        }

        return stringBuffer.toString();
    }
    /**
     *拼接通配符匹配到的字符串
     * @param replaceFilename 改名通配符
     * @param list  需要保留的数据
     * @param keyword  类型 “*”或“?”
     * @param stringBuffer  需要改名的StringBuffer对象
     * @return
     */
    public static StringBuffer jointString (String replaceFilename,List<Object> list,String keyword,StringBuffer stringBuffer) {
        int num = 0;
        while (replaceFilename.indexOf(keyword) != -1) {
            replaceFilename = replaceFilename.substring(replaceFilename.indexOf(keyword) + 1);
            num++;
        }
        if (num != 0) {
            if (num > list.size()) {
                for (int i = 0; i < num - list.size(); i++) {
                    if("*".equals(keyword)){
                        stringBuffer = stringBuffer.replace(stringBuffer.lastIndexOf(keyword), stringBuffer.lastIndexOf(keyword) + 1, UUID.randomUUID().toString());
                    }else{
                        stringBuffer = stringBuffer.replace(stringBuffer.lastIndexOf(keyword), stringBuffer.lastIndexOf(keyword) + 1, "A");
                    }
                }
            }
            if (stringBuffer.indexOf(keyword) != -1) {
                for (Object obj : list) {
                    stringBuffer = stringBuffer.replace(stringBuffer.indexOf(keyword), stringBuffer.indexOf(keyword) + 1, obj.toString());
                    if(stringBuffer.indexOf(keyword) == -1){
                        break;
                    }
                }
            }

        }
        return stringBuffer;
    }
}

运行结果:

Java替换Word模板 java替换文件名_Java替换Word模板_03

今天的分享到此为止,如果大家对此有什么建议还请多多留意交流