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

这篇具有很好参考价值的文章主要介绍了使用正则表达式判断日期字符串格式是否合法遇到的问题(解决)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

我们在使用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}):匹配一到两位数字,表示月份或日期

$:匹配字符串的结尾文章来源地址https://www.toymoban.com/news/detail-711979.html

到了这里,关于使用正则表达式判断日期字符串格式是否合法遇到的问题(解决)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用正则表达式 移除 HTML 标签后得到字符串

    在上述代码中,stripHTMLTags 函数使用正则表达式 /[^]+/g 来匹配所有的 HTML 标签,并使用空字符串进行替换,从而将 HTML 标签移除。 最后,返回移除 HTML 标签后的字符串。

    2024年02月14日
    浏览(41)
  • 12.字符串和正则表达式

    正则表达式相关知识 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要,正则表达式就是用于描述这些规则的工具,换句话说正则表达式是一种工具,它定义了字符串的匹配模式(如何检查一个字符串是否有跟某种模式匹配的部分或者从一个

    2024年01月16日
    浏览(46)
  • Java基础十八(正则表达式 + 日期时间)

    1.1 普通字符 字符 描述 示例 [abc] 匹配 […] 中所有字符 [hlo] 匹配字符串 \\\"hello world\\\" 中所有的 h l o 字母 [^ABC] 匹配除了 […] 中所有字符 [hlo] 匹配字符串 \\\"hello world\\\" 中除了 h l o 的所有字母 [^a-z] 匹配除了 […] 中所有字符 [hlo] 匹配字符串 \\\"hello world\\\" 中除了 a 到 z 的所有字母 [A-

    2024年02月11日
    浏览(48)
  • python 正则表达式提取字符串

    1、提取字符串的场景及公式、命令 背景 :目前遇到的场景主要是以某个字符串开始、某个字符串结束,提取中间部分的字符,有的时候需要开始的字符,有时不需要,大概涉及到了4种情况,场景及处理方式如下: 1.1 以某个字符开始、某个字符结束,期待的提取结果 包含

    2024年02月02日
    浏览(44)
  • java之字符串与正则表达式

    目录 String 构造方法 注意 格式控制字符串 常用方法 StringBuilder与StringBuffer 特点 理解可变与不可变 字符串拼接方法 字符串删除方法 字符串内插入字符 字符串替换方法 字符串反转方法 查字符串对应索引处的字符  截取字符串 正则表达式 正则表达式符号表 正则表达式常用方

    2023年04月22日
    浏览(34)
  • 【python】12.字符串和正则表达式

    正则表达式相关知识 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要,正则表达式就是用于描述这些规则的工具,换句话说正则表达式是一种工具,它定义了字符串的匹配模式(如何检查一个字符串是否有跟某种模式匹配的部分或者从一个

    2024年01月16日
    浏览(38)
  • notepad++ 正则表达式查找特定字符串

    批量文本的处理方法 在报文中有很多指标和值都具有固定的格式,比如是  a=\\\"1\\\" 这类格式,那么我们只取前面的指标a,就会比较复杂,而使用正则表达式就会快乐许多! 采用以下第二种方法 查找目标 =(.+?)\\\"    表示查找以等号开头,引号和空格  结尾的字符串,可以避免查

    2024年02月15日
    浏览(41)
  • 正则表达式中 “$” 并不是表示 “字符串结束

    作者:Seth Larson 译者:豌豆花下猫@Python猫 英文:Regex character “$” doesn\\\'t mean “end-of-string” 转载请保留作者及译者信息! 这篇文章写一写我最近在用 Python 的正则表达式模块( re )开发 CPython 的 SBOM 工具时发现的一个令人惊讶的行为。 如果用过正则表达式,你可能知道 ^

    2024年04月15日
    浏览(29)
  • Python 自学(五) 之字符串及正则表达式

    目录 1. 字符串的分割合并  split()  join()         P132 2. 字符串的检索   count() find() index() startswith() endswith()         P134 3. 去除空格和特殊字符   strip()  lstrip() rstrip()          P139 4. 格式化字符串   format()         P142 5. 字符串编码转换  encode()  decode()        P145

    2024年01月25日
    浏览(41)
  • 【动态规划】【字符串】C++算法:正则表达式匹配

    视频算法专题 动态规划汇总 字符串 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘ ’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符 \\\' ’ 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。 示例 1: 输入:

    2024年02月03日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包