支持类似
[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 版权协议,转载请附上原文出处链接和本声明。