java匹配带有时间格式的文件名

  • Post author:
  • Post category:java


支持类似

[yyyy-MM-dd]output.xml.gz

格式

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class a {

	public static void main(String[] args) {

		test1();
		
	}

	/**
	 * 匹配时间
	 * 
	 * @param name 名称,如:2020-03-05output.xml.gz
	 * @param rule 匹配规则,如:[yyyy-MM-dd]output.xml.gz,时间表达式取第一个[]之间的,支持多个[]
	 * @return 布尔值
	 */
	public static boolean piPeiShiJian(String name, String rule) {

		// [{uuid,转换过的占位符},{uuid,转换过的占位符}],如[{111,[0-9]{4}-[0-9]{2}-[0-9]{2}},{222,[0-9]{4}-[0-9]{2}-[0-9]{2}}]
		List<Map<String, String>> list = new ArrayList<>();

		// 获取[]的内容
		Matcher m = Pattern.compile("\\[.*?\\]").matcher(rule);

		// 如果匹配到就解析
		while (m.find()) {

			// 检测到方括号:[yyyy-MM-dd]
			String str1 = m.group();

			// [yyyy-MM-dd]替换成正则:[0-9]{4}-[0-9]{2}-[0-9]{2}
			String str2 = zhuanHuan(str1);

			// [yyyy-MM-dd]output.xml.gz替换成uuid:4694ec97babd4e98ab3992037854125aoutput.xml.gz
			String uuid = getUUID();
			rule = rule.replace(str1, uuid);

			// 存放uuid与正则的对应关系
			Map<String, String> map = new HashMap<String, String>();
			map.put("key", uuid);
			map.put("value", str2);
			list.add(map);
		}

		// 匹配到[]
		if (list.size() > 0) {
			// 这一步不能在上面的while中或者下面的return前做,不然会把正则表达式替换成转义字符
			rule = zhuanYi(rule);
			for (Map<String, String> map : list) {
				rule = rule.replace(map.get("key"), map.get("value"));
			}
			return name.matches(rule);
		}
		// 匹配不到[]
		else {
			return name.matches(zhuanYi(rule));
		}
	}

	// 把字符串中会被认为是正则表达式的字符转换成转义字符(*作为正则表达式不转义)
	public static String zhuanYi(String rule) {

		rule = rule.replace(".", "\\.")
				.replace("-", "\\-")
				.replace("(", "\\(")
				.replace(")", "\\)")
				.replace("[", "\\[")
				.replace("]", "\\]")
				.replace("{", "\\{")
				.replace("}", "\\}");

		String reg = "^(" + rule.replace("*", ")(.*)(") + ")$";

		if (rule.startsWith("*")) {
			reg = reg.replace("^()", "");
		}

		if (rule.endsWith("*")) {
			reg = reg.replace("()$", "");
		}

		return reg;
	}

	// 将占位符转换成正则表达式,dd没有判断范围,直接按31天来,如:[yyyyMMdd]转换为[0-9]{4}(01|02|03|04|05|06|07|08|09|10|11|12)(01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)
	public static String zhuanHuan(String str) {

		// 去掉左右括号:[yyyyMMdd]->yyyyMMdd
		str = str.replace("[", "").replace("]", "");

		// 把占位符替换成正则表达式
		str = str.replace("yyyy", "[0-9]{4}")
				.replace("MM", "(01|02|03|04|05|06|07|08|09|10|11|12)")
				.replace("dd", "(01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)")
				.replace("HH", "(00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23)")
				.replace("mm", "(00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59)")
				.replace("ss", "(00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59)")
				.replace("SSS", "[0-9]{3}");

		return str;
	}

	public static String getUUID() {
		return UUID.randomUUID().toString().replace("-", "").toLowerCase();
	}
	
	public static void test1() {
		
		String name1 = "2020-03-05output.xml.gz";
		String rule1 = "[yyyy-MM-dd]output.xml.gz";
		System.out.println("名称:" + name1 + ",规则:" + rule1 + ",结果:" + piPeiShiJian(name1, rule1));

		String name11 = "log-2020-03-05output.xml.gz";
		String rule11 = "[yyyy-MM-dd]output.xml.gz";
		System.err.println("名称:" + name11 + ",规则:" + rule11 + ",结果:" + piPeiShiJian(name11, rule11));

		String name2 = "2020-03-05output23:03:01.666.xml.gz";
		String rule2 = "[yyyy-MM-dd]output[HH:mm:ss.SSS].xml.gz";
		System.out.println("名称:" + name2 + ",规则:" + rule2 + ",结果:" + piPeiShiJian(name2, rule2));

		String name22 = "2020-03-05output23:03:01.xml.gz";
		String rule22 = "[yyyy-MM-dd]output[HH:mm:ss.SSS].xml.gz";
		System.err.println("名称:" + name22 + ",规则:" + rule22 + ",结果:" + piPeiShiJian(name22, rule22));

		String name3 = "2020-03-05output.xml.gz";
		String rule3 = "2020-03-05*.xml.gz";
		System.out.println("名称:" + name3 + ",规则:" + rule3 + ",结果:" + piPeiShiJian(name3, rule3));

		String name33 = "log-2020-03-05output.xml.gz";
		String rule33 = "2020-03-05*.xml.gz";
		System.err.println("名称:" + name33 + ",规则:" + rule33 + ",结果:" + piPeiShiJian(name33, rule33));
		
		String name4 = "a.b.c.txt";
		String rule4 = "a.b.c.txt";
		System.out.println("名称:" + name4 + ",规则:" + rule4 + ",结果:" + piPeiShiJian(name4, rule4));
		
		String name44 = "a.b.c.log";
		String rule44 = "a.b.c.txt";
		System.err.println("名称:" + name44 + ",规则:" + rule44 + ",结果:" + piPeiShiJian(name44, rule44));
	}
}

测试输出:

名称:2020-03-05output.xml.gz,规则:[yyyy-MM-dd]output.xml.gz,结果:true
名称:log-2020-03-05output.xml.gz,规则:[yyyy-MM-dd]output.xml.gz,结果:false
名称:2020-03-05output23:03:01.666.xml.gz,规则:[yyyy-MM-dd]output[HH:mm:ss.SSS].xml.gz,结果:true
名称:2020-03-05output23:03:01.xml.gz,规则:[yyyy-MM-dd]output[HH:mm:ss.SSS].xml.gz,结果:false
名称:2020-03-05output.xml.gz,规则:2020-03-05*.xml.gz,结果:true
名称:log-2020-03-05output.xml.gz,规则:2020-03-05*.xml.gz,结果:false
名称:a.b.c.txt,规则:a.b.c.txt,结果:true
名称:a.b.c.log,规则:a.b.c.txt,结果:false

支持类似

[yyyy]-[MM]-[dd]output.xml.gz

格式

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class a2 {

	public static void main(String[] args) {

		test1();
		
	}

	/**
	 * 匹配时间
	 * 
	 * @param name 名称,如:2020-03-05output.xml.gz
	 * @param rule 匹配规则,如:[yyyy]-[MM]-[dd]output.xml.gz,时间表达式取第一个[]之间的,支持多个[]
	 * @return 布尔值
	 */
	public static boolean piPeiShiJian(String name, String rule) {

		// [{uuid,转换过的占位符},{uuid,转换过的占位符}],如[{111,[0-9]{4}-[0-9]{2}-[0-9]{2}},{222,[0-9]{4}-[0-9]{2}-[0-9]{2}}]
		List<Map<String, String>> list = new ArrayList<>();

		// 获取[]的内容
		Matcher m = Pattern.compile("\\[.*?\\]").matcher(rule);

		// 如果匹配到就解析
		while (m.find()) {

			// 检测到方括号:[yyyy]
			String str1 = m.group();

			// [yyyy]替换成正则:[0-9]{4}
			String str2 = zhuanHuan(str1);

			// [yyyy]-[MM]-[dd]output.xml.gz替换成uuid:4694ec97babd4e98ab3992037854125a-[MM]-[dd]output.xml.gz
			String uuid = getUUID();
			rule = rule.replace(str1, uuid);

			// 存放uuid与正则的对应关系
			Map<String, String> map = new HashMap<String, String>();
			map.put("key", uuid);
			map.put("value", str2);
			list.add(map);
		}

		// 匹配到[]
		if (list.size() > 0) {
			// 这一步不能在上面的while中或者下面的return前做,不然会把正则表达式替换成转义字符
			rule = zhuanYi(rule);
			for (Map<String, String> map : list) {
				rule = rule.replace(map.get("key"), map.get("value"));
			}
			return name.matches(rule);
		}
		// 匹配不到[]
		else {
			return name.matches(zhuanYi(rule));
		}
	}

	// 把字符串中会被认为是正则表达式的字符转换成转义字符(*作为正则表达式不转义)
	public static String zhuanYi(String rule) {

		rule = rule.replace(".", "\\.")
				.replace("-", "\\-")
				.replace("(", "\\(")
				.replace(")", "\\)")
				.replace("[", "\\[")
				.replace("]", "\\]")
				.replace("{", "\\{")
				.replace("}", "\\}");

		String reg = "^(" + rule.replace("*", ")(.*)(") + ")$";

		if (rule.startsWith("*")) {
			reg = reg.replace("^()", "");
		}

		if (rule.endsWith("*")) {
			reg = reg.replace("()$", "");
		}

		return reg;
	}

	// 将占位符转换成正则表达式,dd没有判断范围,直接按31天来,如:[yyyyMMdd]转换为[0-9]{4}(01|02|03|04|05|06|07|08|09|10|11|12)(01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)
	public static String zhuanHuan(String str) {
		
		switch(str) {
			case "[yyyy]" :
				return "[0-9]{4}";
			case "[M]" :
				return "(1|2|3|4|5|6|7|8|9|10|11|12)";
			case "[MM]" :
				return "(01|02|03|04|05|06|07|08|09|10|11|12)";
			case "[d]" :
				return "(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)";
			case "[dd]" :
				return "(01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)";
			case "[h]" :
				return "(0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23)";
			case "[HH]" :
				return "(00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23)";
			case "[m]" :
				return "(0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59)";
			case "[mm]" :
				return "(00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59)";
			case "[s]" :
				return "(0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59)";
			case "[ss]" :
				return "(00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59)";
			case "[SSS]" :
				return "[0-9]{3}";
			default :
				// 如[A]转换成
				return zhuanYi(str);
		}
	}

	public static String getUUID() {
		return UUID.randomUUID().toString().replace("-", "").toLowerCase();
	}
	
	public static void test1() {
		
		String name1 = "2020-03-05output.xml.gz";
		String rule1 = "[yyyy]-[MM]-[dd]output.xml.gz";
		System.out.println("名称:" + name1 + ",规则:" + rule1 + ",结果:" + piPeiShiJian(name1, rule1));

		String name11 = "log-2020-03-05output.xml.gz";
		String rule11 = "[yyyy]-[MM]-[dd]output.xml.gz";
		System.err.println("名称:" + name11 + ",规则:" + rule11 + ",结果:" + piPeiShiJian(name11, rule11));

		String name2 = "2020-03-05output23:03:01.666.xml.gz";
		String rule2 = "[yyyy]-[MM]-[dd]output[HH]:[mm]:[ss].[SSS].xml.gz";
		System.out.println("名称:" + name2 + ",规则:" + rule2 + ",结果:" + piPeiShiJian(name2, rule2));

		String name22 = "2020-03-05output23:03:01.xml.gz";
		String rule22 = "[yyyy]-[MM]-[dd]output[HH]:[mm]:[ss].[SSS].xml.gz";
		System.err.println("名称:" + name22 + ",规则:" + rule22 + ",结果:" + piPeiShiJian(name22, rule22));

		String name3 = "2020-03-05output.xml.gz";
		String rule3 = "2020-03-05*.xml.gz";
		System.out.println("名称:" + name3 + ",规则:" + rule3 + ",结果:" + piPeiShiJian(name3, rule3));

		String name33 = "log-2020-03-05output.xml.gz";
		String rule33 = "2020-03-05*.xml.gz";
		System.err.println("名称:" + name33 + ",规则:" + rule33 + ",结果:" + piPeiShiJian(name33, rule33));
		
		String name4 = "a.b.c.txt";
		String rule4 = "a.b.c.txt";
		System.out.println("名称:" + name4 + ",规则:" + rule4 + ",结果:" + piPeiShiJian(name4, rule4));
		
		String name44 = "a.b.c.log";
		String rule44 = "a.b.c.txt";
		System.err.println("名称:" + name44 + ",规则:" + rule44 + ",结果:" + piPeiShiJian(name44, rule44));
	}
}

测试输出

名称:2020-03-05output.xml.gz,规则:[yyyy]-[MM]-[dd]output.xml.gz,结果:true
名称:log-2020-03-05output.xml.gz,规则:[yyyy]-[MM]-[dd]output.xml.gz,结果:false
名称:2020-03-05output23:03:01.666.xml.gz,规则:[yyyy]-[MM]-[dd]output[HH]:[mm]:[ss].[SSS].xml.gz,结果:true
名称:2020-03-05output23:03:01.xml.gz,规则:[yyyy]-[MM]-[dd]output[HH]:[mm]:[ss].[SSS].xml.gz,结果:false
名称:2020-03-05output.xml.gz,规则:2020-03-05*.xml.gz,结果:true
名称:log-2020-03-05output.xml.gz,规则:2020-03-05*.xml.gz,结果:false
名称:a.b.c.txt,规则:a.b.c.txt,结果:true
名称:a.b.c.log,规则:a.b.c.txt,结果:false



版权声明:本文为hjgzj原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。