用正则处理不同格式的日期

背景

客户给到的数据需要导入到自己的数据库里面,但是一个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);

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值