用正则表达式从字符串中提取日期

以后遇到新的情况,再更新吧。。。

日期工具类:

package com.guoxi.common.utils;

import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;

import org.apache.commons.lang3.time.DateFormatUtils;

/**
 * 时间工具类
 *
 * @author frank
 */
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
    private static String[] parsePatterns = {
            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
            "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
            "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM",
            "yyyy年MM月dd日", "yyyy年MM月dd日 HH时mm分ss秒", "yyyy年MM月dd日 HH时mm分", "yyyy年MM月",
            "yyyy年MM月dd日HH:mm", "yyyy年MM月dd日 HH:mm", "yyyy年MM月dd日HH:mm:ss",
            "yyyy年MM月dd日 HH:mm:ss"
    };
    /**
     * 日期型字符串转化为日期 格式
     */
    public static Date parseDate(Object str) {
        if (str == null) {
            return null;
        }
        try {
            return parseDate(str.toString(), parsePatterns);
        } catch (ParseException e) {
            return null;
        }
    }
}

正则提取方法:

    public static void main(String[] args) {
    	// 最近一阵子采集数据中看到的一些日期
        List<String> dateList = Arrays.asList("2021-10-15 16:12:56 来源: 作者:张三 阅读: 17549 ",
                "[2023-04-21]",
                " [ 2022年04月02日 ] ",
                "发布时间:2023年07月18日 20:25 来源:高潮社 编辑:张三",
                "2023年7月4日 19:52",
                "2022年12月22日 21:48",
                "发布时间:2023-07-19 16:13",
                "2022-10-22 17:50",
                "2023-3-13 15:26",
                "2022年10月21日06:28",
                "2022-11-24 17:19");
        List<String> wrongList = new ArrayList<>();
        dateList.forEach(item -> {
            Date date = DataWashUtils.getDateFromString(item);
            if (Objects.isNull(date)) {
            	// 把没有识别出来的放入集合中
                wrongList.add(item);
            }
        });
        wrongList.forEach(System.out::println);
    }

    /**
     * @return java.util.Date
     * @Description 从字符串中提取日期并且转为Date
     * @author frank
     * @date 2023/07/20 16:36
     * @Param val 需要提取日期的字符串
     */
    public static Date getDateFromString(String val) {
        String result = val;
        // 用正则提取日期
        String reg = "(\\d{4}年\\d{1,2}月\\d{1,2}日\\d{1,2}:\\d{1,2})" // yyyy年MM月dd日HH:mm
                + "|(\\d{4}年\\d{1,2}月\\d{1,2}日\\d{1,2}:\\d{1,2}:\\d{1,2})" // yyyy年MM月dd日HH:mm:ss
                + "|(\\d{4}年\\d{1,2}月\\d{1,2}日\\s\\d{1,2}:\\d{1,2}:\\d{1,2})" // yyyy年MM月dd日 HH:mm:ss
                + "|(\\d{4}年\\d{1,2}月\\d{1,2}日\\s\\d{1,2}:\\d{1,2})" // yyyy年MM月dd日 HH:mm
                + "|(\\d{4}年\\d{1,2}月\\d{1,2}日)" // yyyy年MM月dd日
                + "|(\\d{4}(-|\\/|\\.)\\d{1,2}(-|\\/|\\.)\\d{1,2}\\s\\d{1,2}:\\d{1,2}:\\d{1,2})" // // yyyy(/|-|.)MM(/|-|.)dd HH:mm:ss
                + "|(\\d{4}(-|\\/|\\.)\\d{1,2}(-|\\/|\\.)\\d{1,2}\\s\\d{1,2}:\\d{1,2})" // yyyy(/|-|.)MM(/|-|.)dd HH:mm
                + "|(\\d{4}(-|\\/|\\.)\\d{1,2}(-|\\/|\\.)\\d{1,2})" // yyyy(/|-|.)MM(/|-|.)dd
                ;
        Pattern pattern = Pattern.compile(reg);
        Matcher matcher = pattern.matcher(result);
        while (matcher.find()) {
            result = matcher.group();
        }
        return DateUtils.parseDate(result);
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值