首页 > 其他分享 >使用正则表达式判断日期字符串格式是否合法遇到的问题(解决)

使用正则表达式判断日期字符串格式是否合法遇到的问题(解决)

时间:2023-09-30 16:11:42浏览次数:31  
标签:自定义 正则表达式 dd yyyy Date 类型 字符串 格式 MM

引言

我们在使用SpringMVC从前端接受传递过来的日期数据时,默认传递过来的数据是String类型,如果我们从前端传递过来的数据格式是yyyy/MM/dd,SpringMVC有内置类型转化器会将String类型自动转化成Date类型。但如果我们从前端传递过来的数据格式是yyyy-MM-dd,SpringMVC的内置转化器就不能自动转化了,就得我们自定义一个类型转化器。

注意:如果我们自定义类型转化器之后,SpringMVC支持内置类型转化器就不会在生效了。

创建自定义字符串类型转日期类型的类型转化器类

package com.qrj.converter;

import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.support.GenericConversionService;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;

/**
 * @author: qrj
 * @description 自定义字符串类型转日期类型的类型转换器
 * @Date: 2023/9/29 16:41
 */
public class StringToDateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String s) {
        Date date = null;
        try{
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
            date = simpleDateFormat.parse(s);
        }catch (Exception e){
            e.printStackTrace();
        }
        return date;
    }
}

我们一个在类型转化器类里面写一个main方法进行测试,看能不能将yyyy-MM-dd格式的字符串转化成Date类型的数据。

public static void main(String[] args) {
        //创建类型转换服务实例
        GenericConversionService genericConversionService = new GenericConversionService();
        //想类型转换服务实例中注册自定义类型转换器
        genericConversionService.addConverter(new StringToDateConverter());
        //使用自定义类型转换器
        String dateStr = "2023-9-29";
        Date date = genericConversionService.convert(dateStr,Date.class);
        System.out.println(date);
}

测试结果如下:

测试成功,自定义类型转化器可以将yyyy-MM-dd格式的字符串转化成Date类型的数据。

但问题来咯!有自定义类型转化器之后,SpringMVC支持内置类型转化器就不会在生效。如果我们前端数据传一个yyyy/MM/dd格式的日期呢???

解决这个问题,我们是不是应该进行一个判断,这里正则表达式就出场咯。如果前端传递过来的是yyyy-MM-dd格式的字符串,就将它转化为Date类型,如果前端传递过来的是yyyy/MM/dd格式的字符串,也将它转化为Date类型。

用正则表达式判断日期字符串是否合法

package com.qrj.converter;

import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.support.GenericConversionService;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;

/**
 * @author: qrj
 * @description 自定义字符串类型转日期类型的类型转换器
 * @Date: 2023/9/29 16:41
 */
public class StringToDateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String s) {
        Date date = null;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try{
            //可以使用正则表达式判断日期字符串格式是否合法(支持 yyyy-MM-dd 和 yyyy/MM/dd 格式)
            boolean isMate1 = Pattern.matches("^(\\d{4})-(\\d{2})-(\\d{2})$",s);
            if (isMate1 == true){
                simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
            }
            boolean isMate2 = Pattern.matches("^(\\d{4})/(\\d{2})/(\\d{2})$",s);
            if (isMate2 == true){
               simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
            }
            date = simpleDateFormat.parse(s);
        }catch (Exception e){
            e.printStackTrace();
        }
        return date;
    }
}

注意:上面Pattern.matches()方法是Java中用于检查给定字符串是否与给定模式匹配的静态方法。它接受两个参数:第一个参数是表示正则表达式模式的字符串,第二个参数是待检查的字符串。

编写测试代码,进行测试:

//测试自定义类型转换器
    public static void main(String[] args) {
        //创建类型转换服务实例
        GenericConversionService genericConversionService = new GenericConversionService();
        //想类型转换服务实例中注册自定义类型转换器
        genericConversionService.addConverter(new StringToDateConverter());
        //使用自定义类型转换器
        String dateStr = "2023/9/29";
        Date date = genericConversionService.convert(dateStr,Date.class);
        System.out.println(date);
}

测试结果如下:

报错原因是无法解析的date :"2023/9/29" 

遇到问题

在网上查询资料得知,原因是在 SimpleDateFormat中使用的日期格式与实际的日期字符串格式不匹配,导致无法解析。在"2023/9/29"这种格式的日期字符串中,月份部分只有一位数字,日期部分有两位数字,而在正则表达式中(\\d{2})日期和月份部分匹配两位数字。这使得2023/9/29与正则表达式不匹配,返回false,无法将2023/9/29这种格式的日期字符串解析。

解决问题

为了解决这一问题,可以通过修改正则表达式的月份跟日期部分为(\\d{1,2})使其匹配一到两位数字。以下是修改后的代码:

package com.qrj.converter;

import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.support.GenericConversionService;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;

/**
 * @author: qrj
 * @description 自定义字符串类型转日期类型的类型转换器
 * @Date: 2023/9/29 16:41
 */
public class StringToDateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String s) {
        Date date = null;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try{
            //可以使用正则表达式判断日期字符串格式是否合法(支持 yyyy-MM-dd 和 yyyy/MM/dd 格式)
            boolean isMate1 = Pattern.matches("^(\\d{4})-(\\d{2})-(\\d{2})$",s);
            if (isMate1){
                simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
            }
            boolean isMate2 = Pattern.matches("^(\\d{4})/(\\d{1,2})/(\\d{1,2})$",s);
            if (isMate2){
               simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
            }
            date = simpleDateFormat.parse(s);
        }catch (Exception e){
            e.printStackTrace();
        }
        return date;
    }

    //测试自定义类型转换器
    public static void main(String[] args) {
        //创建类型转换服务实例
        GenericConversionService genericConversionService = new GenericConversionService();
        //想类型转换服务实例中注册自定义类型转换器
        genericConversionService.addConverter(new StringToDateConverter());
        //使用自定义类型转换器
        String dateStr = "2023/9/29";
        String dateStr2 = "2023-9-30";
        Date date = genericConversionService.convert(dateStr,Date.class);
        Date date2 = genericConversionService.convert(dateStr2,Date.class);
        System.out.println(date);
        System.out.println(date2);
    }
}

进行测试如下:

成功将yyyy-MM-dd格式和yyyy/MM/dd格式的字符串转化成Date类型的数据。

正则表达式

"^(\\d{4})-(\\d{2})-(\\d{2})$"
"^(\\d{4})/(\\d{1,2})/(\\d{1,2})$"

^:匹配字符串的开头

(\\d{4}):匹配四位数字,表示年份

-或/:匹配横杠或斜杠字符

(\\d{1,2}):匹配一到两位数字,表示月份或日期

$:匹配字符串的结尾

标签:自定义,正则表达式,dd,yyyy,Date,类型,字符串,格式,MM
From: https://www.cnblogs.com/one-xiaoqiang/p/17737928.html

相关文章

  • 关于http-https的URL格式-及URL-Encode-基本格式分析
    关于http,https的协议格式,在很多资料上看到,基URL格式的如下:shceme://username:password@host:port/path;params?query#fragparams:key=value&key2=value2query(前面的资源可能会有SQL的where语句,一般就使用这里query):field=value&field=value2frag:锚定一个大的网页的......
  • kitti彩色地图拼接<一>、点云bin格式转为pcd格式
      下面是bin格式转pcd格式批量处理代码,其中品红色是需要改成你的实际情况的地方。cpp:【note:代码中,pcd文件的路径改为你自己的】1#include<boost/program_options.hpp>2#include<pcl/point_types.h>3#include<pcl/io/pcd_io.h>4#include<pcl/common/point_ope......
  • 解析pcap格式点云数据包
    1、多BB一句,不想写代码,就去速腾的驱动中复制粘贴。2、问别人的时候,应该问有没有128线速腾雷达数据帧格式资料(每个字段的意义),工具对应读取数据那一块源码能否给出来。 激光雷达每一帧的数据长度固定为1248字节,前42字节的前数据包标识、12组数据包、4字节时间戳和最后两字节雷达......
  • ​​pandas.get_dummies()​​ 是一个用于执行独热编码(One-Hot Encoding)的 pandas 函
    pandas.get_dummies()是一个用于执行独热编码(One-HotEncoding)的pandas函数。它用于将分类(或离散)特征转换为模型可以处理的二进制格式,以便更好地在机器学习算法中使用。独热编码将每个不同的类别值转换为一个新的二进制特征列,其中每个列代表一个类别,并且只有一个值为1,其余为0......
  • Bash-条件判断(文件判断,整型/字符串判断)
    按文件类型判断红框常用 使用方式:test-e/root/install.log[-e/root/install.log]#[前后有空格]常用判断,比如判断root是否为目录[-d/root]&&echo"yes"||echo"no" 按文件权限判断 例子:若有student.txt权限如下:-rw-r--r--;不能判断是哪个是否......
  • 字符串常量池
    1.简介字符串常量池(StringPool)又称为字符串池。String类是在工作中使用频率非常高的一种对象类型,JVM为了提升性能和减小内存开销,避免字符串的重复创建,维护了一块特殊的内存空间,即字符串常量池。(由String类私有地维护)字符串池的一个实现前提:String对象是不可变的。2.创......
  • String字符串经典问题
    publicclassExample{Stringstr=newString("good");char[]ch={'a','b','c'};publicstaticvoidmain(Stringargs[]){Exampleex=newExample();ex.change(ex.str,ex.ch);......
  • JS判断字符串是否全为空
    1、使用trim()方法trim()方法会去除首尾空格,并返回一个处理后的新值<template><divclass="box">content</div></template><scriptsetup>import{ref,reactive,toRefs,watch,computed,defineProps,}from'vue';import{useStore}......
  • 数据结构---字符串
    数据结构---字符串串的定义串是由零个或多个字符顺序排列组成的有限序列空串长度为零的串空白串由一个或多个空格组成的串字符串匹配问题朴素模式匹配模式匹配的查找过程(Find):给定两个字符串变量S和P,其中目标S有n个字符,模式P有m个字符,m<=n。从S的给定位置(通常为S的第......
  • 字符串排序算法+快速排序
    #include<stdio.h>#include<stdlib.h>#include<memory>#include<vector>#include<string>usingnamespacestd;voidswap(int*a,int*b){inttemp=*a;*a=*b;*b=temp;}voidquicksort(int*arr,intsta......