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

来源:https://www.cnblogs.com/okokabcd/archive/2022/06/23/16407130.html
-Advertisement-
Play Games

前言 回歸分析就是用於預測輸入變數(自變數)和輸出變數(因變數)之間的關係,特別當輸入的值發生變化時,輸出變數值也發生改變!回歸簡單來說就是對數據進行擬合。線性回歸就是通過線性的函數對數據進行擬合。機器學習並不能實現預言,只能實現簡單的預測。我們這次對房價關於其他因素的關係。 波士頓房價預測 下載相 ...


一、介紹

正則表達式可用於匹配各種模式,本文將用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 匹配數字

創建一個簡單的正則來對字元串進行格式約束:

public class FormattedDateMatcher implements DateMatcher {
    private static final Pattern DATE_PATTERN = 
        Pattern.compile("^\\d{2}-\\d{4}-\\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()。

四、總結

本文我們學習了使用正則表達式從格式、範圍和月份長度等規則匹配西曆日期。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 隨著信息化的發展,很多具有重要價值的知識隱藏分佈在海量數據中,影響了人們獲取知識的效率,如何處理繁雜的非結構化文本數據成為難題。 近日,HMS Core機器學習服務6.5.0版本新增線上文本實體抽取能力,該能力可以檢測出文本中是否存在比如日期、姓名、專有名詞等實體信息,並將此類實體抽取出來,即自動處 ...
  • vue2中只能有一個根標簽,但是在vue3中根組件已經可以有多個根節點了 在vue2中只所以這麼做是因為vdom是一顆單根樹形結構,patch方法在遍歷的時候從根節點開始遍歷,它要求只有一個根節點,組件也會轉換為一個vdom,自然滿足這個要求 vue3中值所以可以有多個節點,是因為引入了Fragme ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 1. 防抖節流 這也是一個經典題目了,首先要知道什麼是防抖,什麼是節流。 防抖: 在一段時間內,事件只會最後觸發一次。 節流: 事件,按照一段時間的間隔來進行觸發。 實在不懂的話,可以去這個大佬的Demo地址玩玩防抖節流DEMO // 防 ...
  • TinyMCE是一款易用、且功能強大的所見即所得的富文本編輯器。同類程式有:UEditor、Kindeditor、Simditor、CKEditor、wangEditor、Suneditor、froala等等。 配置靈活,界面簡潔,支持自定義插件。 TinyMCE中文手冊:http://tinymc ...
  • 一、前言 小編最近開始學習typescript,懂得人都知道,typescript是vue3的基礎伴生,配合更加默契。就像vue2和js一樣!typescript不像js那樣瀏覽器直接可以解讀,需要我們把ts文件編譯成js文件,這樣瀏覽器才可以解讀。所以我們要安裝一下ts的環境和自動編譯,方便我們後 ...
  • 前言 : 組件系統是Vue.js其中一個重要的概念,它提供了一種抽象,讓我們可以使用獨立可復用的小組件來構建大型應用,任意類型的應用界面都可以抽象為一個組件樹。 現在基於vue的UI組件庫有很多,比如iview,element-ui等。但有時候這些組件庫滿足不了我們的開發需求,這時候我們就需要自己寫 ...
  • 1 前言 在嵌入式MCU軟體開發過程中,程式分層設計也是重中之重,關係到整個軟體開發過程中的協同開發,降低系統軟體的複雜度(複雜問題分解)和依賴關係、同時有利於標準化,便於管理各層的程式,提高各層邏輯的復用等。 2 分層介紹 2.1 硬體抽象層(HAL) 嵌入式開發的核心就是晶元,它提供固定的片內資 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
一周排行
    -Advertisement-
    Play Games
  • 最近做項目過程中,使用到了海康相機,官方只提供了C/C++的SDK,沒有搜尋到一個合適的封裝了的C#庫,故自己動手,簡單的封裝了一下,方便大家也方便自己使用和二次開發 ...
  • 前言 MediatR 是 .NET 下的一個實現消息傳遞的庫,輕量級、簡潔高效,用於實現進程內的消息傳遞機制。它基於中介者設計模式,支持請求/響應、命令、查詢、通知和事件等多種消息傳遞模式。通過泛型支持,MediatR 可以智能地調度不同類型的消息,非常適合用於領域事件處理。 在本文中,將通過一個簡 ...
  • 前言 今天給大家推薦一個超實用的開源項目《.NET 7 + Vue 許可權管理系統 小白快速上手》,DncZeus的願景就是做一個.NET 領域小白也能上手的簡易、通用的後臺許可權管理模板系統基礎框架。 不管你是技術小白還是技術大佬或者是不懂前端Vue 的新手,這個項目可以快速上手讓我們從0到1,搭建自 ...
  • 第1章:WPF概述 本章目標 瞭解Windows圖形演化 瞭解WPF高級API 瞭解解析度無關性概念 瞭解WPF體繫結構 瞭解WPF 4.5 WPF概述 ​ 歡迎使用 Windows Presentation Foundation (WPF) 桌面指南,這是一個與解析度無關的 UI 框架,使用基於矢 ...
  • 在日常開發中,並不是所有的功能都是用戶可見的,還在一些背後默默支持的程式,這些程式通常以服務的形式出現,統稱為輔助角色服務。今天以一個簡單的小例子,簡述基於.NET開發輔助角色服務的相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 第3章:佈局 本章目標 理解佈局的原則 理解佈局的過程 理解佈局的容器 掌握各類佈局容器的運用 理解 WPF 中的佈局 WPF 佈局原則 ​ WPF 視窗只能包含單個元素。為在WPF 視窗中放置多個元素並創建更貼近實用的用戶男面,需要在視窗上放置一個容器,然後在這個容器中添加其他元素。造成這一限制的 ...
  • 前言 在平時項目開發中,定時任務調度是一項重要的功能,廣泛應用於後臺作業、計劃任務和自動化腳本等模塊。 FreeScheduler 是一款輕量級且功能強大的定時任務調度庫,它支持臨時的延時任務和重覆迴圈任務(可持久化),能夠按秒、每天/每周/每月固定時間或自定義間隔執行(CRON 表達式)。 此外 ...
  • 目錄Blazor 組件基礎路由導航參數組件參數路由參數生命周期事件狀態更改組件事件 Blazor 組件 基礎 新建一個項目命名為 MyComponents ,項目模板的交互類型選 Auto ,其它保持預設選項: 客戶端組件 (Auto/WebAssembly): 最終解決方案裡面會有兩個項目:伺服器 ...
  • 先看一下效果吧: isChecked = false 的時候的效果 isChecked = true 的時候的效果 然後我們來實現一下這個效果吧 第一步:創建一個空的wpf項目; 第二步:在項目裡面添加一個checkbox <Grid> <CheckBox HorizontalAlignment=" ...
  • 在編寫上位機軟體時,需要經常處理命令拼接與其他設備進行通信,通常對不同的命令封裝成不同的方法,擴展稍許麻煩。 本次擬以特性方式實現,以兼顧維護性與擴展性。 思想: 一種命令對應一個類,其類中的各個屬性對應各個命令段,通過特性的方式,實現其在這包數據命令中的位置、大端或小端及其轉換為對應的目標類型; ...