背景
客户给到的数据需要导入到自己的数据库里面,但是一个excel里面给的日期格式竟然千奇百怪的.
有20240705这种格式的有2024/7/5这种格式的,有2024.7.5这种格式的
还有些只有2027/5或者2027.5这种只有月的
这种可以正则解决,可以把日期的那一列从excel里面拷出来.用正则替换以后再拷回去
至于是用ide里面的正则查找和替换把四个正则替换过去还是java里面run一下,
简单介绍正则
这里\d指匹配单个数字 , \d{4}是匹配4个数字 , \d{1,2} 是匹配1到2个数字
.是表示任意字符 , 如果要匹配.这个字符需要转义 , 就是\. 然后 [\./] 匹配 .或者/这个符号
()代表匹配组 转义后的括号不算 , 然后根据左括号的开始下标顺序 , 在替换的时候可以用 $1到$9的9个匹配组.$0是本身.
9以后是不行的,所以有些组不用的话,可以用 (?!这里写正则) 来,就不会占用替换时候的组号(但是这里没用到)
代码(或者说正则)
下面的4个replaceAll是4个步骤
第一步,补全只有月的日期,因为要入库,日就都给他设置为1号吧,至于如何判断的,
因为拷出来之后每个日期单独成一行,在(\d{4})./后面加个\n ,
这样可以匹配只有年月的日期(记得要加\n,不然会把正常日期也匹配到)
然后给他补个日 . 这里为什么替换为 0$2 后面说
第二步:正常格式的月,日都是两位数字,没有分隔符的,是最常规的格式 , 直接加上分隔符变为$1-$2-$3
第三步:利用.或者/隔开,那么中间就是[\./],但是月和日有可能是要前置补零的 , 统一替换为
$1-0$2-0$3 , 例如2024.5.12,会变成 2024-05-012 . 0多了无所谓,后面给他统一去掉
然后最后一步:去除多余的0,正则是 \d*(\d{2}) , 也就是两个数字意外的数字没有匹配进组 , 所以替换的时候就给他忽略了.
,这样原来的 例如 2024-05-012 会变为 2024-05-12
最后,就是标注的 yyyy-MM-dd 的标准年月日格式了
String input = "" +
"2024-01-08\n" +
"2024.2\n" +
"2024.3.16\n" +
"2024.11.13\n" +
"2024.12.5\n" +
"2024.8.9\n" +
"2024.07.9\n" +
"2023/4\n" +
"2023/7/11\n" +
"2023/07/11";
input = input.replaceAll("(\\d{4})[\\./](\\d{1,2})\\n", "$1-0$2-01\n");
input = input.replaceAll("(\\d{4})(\\d{2})(\\d{2})", "$1-$2-$3");
input = input.replaceAll("(\\d{4})[\\./](\\d{1,2})[\\./](\\d{1,2})", "$1-0$2-0$3");
input = input.replaceAll("(\\d{4}-)\\d*(\\d{2}-)\\d*(\\d{2})", "$1$2$3");
System.out.println(input);