欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中使用正則檢查有效日期的實現

 更新時間:2023年10月11日 11:11:19   作者:okokabcd  
要判斷一個字符串是否符合時間格式,可以使用正則表達式,本文主要介紹了Java中使用正則檢查有效日期的實現,具有一定的參考價值,感興趣的可以了解一下

一、介紹

正則表達式可用于匹配各種模式,本文將用java中的正則來檢測給定字符串是否飲包含有效日期

二、日期格式概述

先對公歷中一個有效日期做一個定義,日期格式我們一般定義為yyyy-MM-dd??紤]范圍大小年、閏年等情況,先說閏年。
普通閏年:公歷年份是4的倍數,且不是100的倍數的,為閏年(如2004年、2020年等就是閏年)。
世紀閏年:公歷年份是整百數的,必須是400的倍數才是閏年(如1900年不是閏年,2000年是閏年)。
有效日期舉例:

  • 2017-12-31
  • 2020-02-29
  • 2400-02-29

無效日期舉例

  • 2017/12/31: 分割符不正確
  • 2018-1-1: 沒有前導0
  • 2018-04-31: 天數不正確
  • 2100-02-29: 平年2月只有28天

三、實現

我們要用正則匹配日期,首先先定義一個接口DateMatcher,只提供一個匹配方法

public interface DateMatcher {
    boolean matches(String date);
}

下面逐步介紹實現,構建一個完整解決方案

3.1 匹配數字

創(chuàng)建一個簡單的正則來對字符串進行格式約束:

public class FormattedDateMatcher implements DateMatcher {
    private static final Pattern DATE_PATTERN = 
        Pattern.compile("^\\d{4}-\\d{2}-\\d{2}$");
    @Override
    public boolean matches(String date) {
        return DATE_PATTERN.matcher(date).matches();
    }
}

這里我們指定了一個有效日期必須由三組中劃線分割的整數組成,第一組由4個整數,其余兩組各有兩個整數。
舉例:
匹配的日期: 2017-12-31, 2018-01-31, 0000-00-00, 1029-00-72
不匹配的日期:2018-01, 2018-01-XX, 2020/02/09

3.2 匹配日期的范圍

現在我們成功匹配了一般日期格式,現在我們做進一步約束,我們將年份限定在1900-2999,月份和日期也做同樣的約束

^((19|2[0-9])[0-9]{2})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$

這里我們對三組整數范圍做了約束

  • ((19|2[0-9])[0-9]{2}),通過匹配一個以19開頭或2X開頭后跟幾個任意數字的數字來覆蓋年份的范圍
  • (0[1-9]|1[012]),匹配01-12范圍內的月份
  • (0[1-9]|[12][0-9]|3[01]),匹配01-31范圍內的天數

匹配的日期:1900-01-01,2205-02-31,2999-12-31
不匹配的日期:1989-12-31,2018-05-35,2018-13-05,3000-01-01,2018-01-XX

3.3 匹配2月29

為了匹配2月29,首先要判斷閏年,把1900-2099之間的閏年匹配出來。如果一個數的后2位能被4整除則原數也能被4整除;如果后兩位是00,這個數能被100整除

^((2000|2400|2800|(19|2[0-9])(0[48]|[2468][048]|[13579][26]))-02-29)$

這個正則由以下部分組成

  • 2000|2400|2800 匹配一組閏年,在1900-2999的范圍內,匹配能被400整除的
  • 19|20-9 匹配能被4整除不能被100整除的
  • 02-29 匹配2月29

舉例
匹配的日期:2020-02-29,2024-02-29,2400-02-29
不匹配的日期:2019-02-29,2100-02-29,3200-02-29,2020/02/29

3.4 匹配2月28

2月29是閏年,我們還要匹配平年的2月28

^(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))$

舉例:
匹配的日期: 2018-02-01, 2019-02-13, 2020-02-25
不匹配的日期: 2000-02-30, 2400-02-62, 2018/02/28

3.5. Matching 31-Day Months

3.5 匹配31天的月份

1、3、5、7、8、10、12月份每月31天

^(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))$

舉例:
匹配的日期: 2018-01-31, 2021-07-31, 2022-08-31
不匹配的日期: 2018-01-32, 2019-03-64, 2018/01/31

3.6 匹配30天的月份

4、6、9、11每月30天

^(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30))$

舉例:
匹配的月份: 2018-04-30, 2019-06-30, 2020-09-30

不匹配的月份: 2018-04-31, 2019-06-31, 2018/04/30

3.7 匯總的日期匹配器

現在我們將上面的所有模式合并成一個匹配器滿足所有的日期約束

class GregorianDateMatcher implements DateMatcher {
    private static Pattern DATE_PATTERN = Pattern.compile(
      "^((2000|2400|2800|(19|2[0-9])(0[48]|[2468][048]|[13579][26]))-02-29)$" 
      + "|^(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))$"
      + "|^(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))$" 
      + "|^(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30))$");
    @Override
    public boolean matches(String date) {
        return DATE_PATTERN.matcher(date).matches();
    }
}

我們使用了"|"來匹配28天的、29天的、30天的、31天的,此時我們已經滿足了開始介紹的日期的所有約束

3.8 性能說明

解析復雜的表達式可能會影響性能。本文的主要目的主要是了解用正則來判斷日期的一種思路,如果要一種可靠且快速的方法來驗證日期,請考慮使用Java8提供的LocalDate.parse()。

四、總結

本文我們學習了使用正則表達式從格式、范圍和月份長度等規(guī)則匹配公歷日期。

到此這篇關于Java中使用正則檢查有效日期的實現的文章就介紹到這了,更多相關Java 正則有效日期內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring Boot 搭建 ELK正確看日志的配置流程

    Spring Boot 搭建 ELK正確看日志的配置流程

    這篇文章主要介紹了Spring Boot 搭建 ELK正確看日志的配置流程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • SpringBoot整合Redis時遇到連接問題的解決方法

    SpringBoot整合Redis時遇到連接問題的解決方法

    在使用Spring Boot整合Redis的過程中,經常會遇到連接問題,尤其是當Redis服務部署在遠程服務器上時,所以本文給大家介紹了SpringBoot整合Redis遇到連接問題的解決方法,需要的朋友可以參考下
    2024-11-11
  • Mybatis結果集映射一對多簡單入門教程

    Mybatis結果集映射一對多簡單入門教程

    本文給大家介紹Mybatis結果集映射一對多簡單入門教程,包括搭建數據庫環(huán)境的過程,idea搭建maven項目的代碼詳解,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2021-06-06
  • SpringBoot使用OpenCV的超詳細步驟

    SpringBoot使用OpenCV的超詳細步驟

    最近有個項?需要對圖?圖像進?處理,使?到了開源框架OpenCV,所以下面這篇文章主要給大家介紹了關于SpringBoot使用OpenCV的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-04-04
  • 自定義starter引發(fā)的線上事故記錄復盤

    自定義starter引發(fā)的線上事故記錄復盤

    這篇文章主要為大家介紹了自定義starter引發(fā)的線上事故記錄復盤,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Spring security認證兩類用戶代碼實例

    Spring security認證兩類用戶代碼實例

    這篇文章主要介紹了Spring security認證兩類用戶代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • java1.8安裝及環(huán)境變量配置教程

    java1.8安裝及環(huán)境變量配置教程

    這篇文章主要介紹了java1.8安裝及環(huán)境變量配置,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Log4j按級別輸出日志到不同文件的實現方法

    Log4j按級別輸出日志到不同文件的實現方法

    下面小編就為大家?guī)硪黄狶og4j按級別輸出日志到不同文件的實現方法。
    2016-11-11
  • Java多線程--讓主線程等待所有子線程執(zhí)行完畢在執(zhí)行

    Java多線程--讓主線程等待所有子線程執(zhí)行完畢在執(zhí)行

    Java主線程等待所有子線程執(zhí)行完畢在執(zhí)行,其實在我們的工作中經常的用到,本篇文章就介紹了Java多線程--讓主線程等待所有子線程執(zhí)行完畢在執(zhí)行,有需要的可以了解一下。
    2016-11-11
  • 動態(tài)更改Spring定時任務Cron表達式的優(yōu)雅方案實例詳解

    動態(tài)更改Spring定時任務Cron表達式的優(yōu)雅方案實例詳解

    spring定時器非常強大,但是有時候我們需要在不需要重啟應用就可以動態(tài)的改變Cron表達式的值,下面這篇文章主要給大家介紹了關于動態(tài)更改Spring定時任務Cron表達式的優(yōu)雅方案,需要的朋友可以參考下
    2022-12-12

最新評論