根据通配符修改文件名
今天项目上有个需要,是要根据指定的通配符匹配需要修改的文件,并根据给出的通配符实现改名
需求如下:
拿到需求时,我们首先要构思好如何实现这个功能,应该分几步完成,而不是盲目的进行编码。
这个需要大致可以分成两部分,第一部分就是先判断文件名是否符合匹配通配符的规则,第二部分是将匹配的这一部分的文件名根据改名通配符进行改名。
从上面的需要截图我们可知“ * ”和“?”配置的数据需要保留下来其余的要改变,这个有很多种方式可以实现,以下我们通过将“ * ”和“?”匹配上的数据抠出来放到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;
}
}
运行结果:
今天的分享到此为止,如果大家对此有什么建议还请多多留意交流