最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java正則表達式校驗日期格式實例代碼

 更新時間:2023年05月27日 09:44:35   作者:RanLZ  
如果使用得當,正則表達式是匹配各種模式的強大工具,下面這篇文章主要給大家介紹了關(guān)于java正則表達式校驗日期格式的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

1 引言

我們時常會遇到,判斷一個String是不是合法的日期格式。當其是一個正確的日期時,我們還需要判斷其格式是否符合我們的規(guī)范,常見格式如下:

  • yyyyMMdd (20220929)
  • yyyy-MM-dd (2022-09-29)
  • yyyy/MM/dd (2022/09/29)
  • yyyy.MM.dd (2022.09.29)

對于這些不同的格式來說,其實我們只要確定了年月日,再根據(jù)不同的格式來微調(diào)我們的正則表達式即可。因此本篇講解以格式 yyyyMMdd 為例。其他格式不再詳解,其正則表達式微調(diào)即可得到,這里就不贅述了。

2 基礎(chǔ)知識

2.1 什么是正確的日期

MSDN中定義的DateTime對象的有效范圍是:0001-01-01 00:00:00到9999-12-31 23:59:59。

  • 因此我們篩選的日期為 0001010199991231 (以格式 yyyyMMdd 為例,后文將不再強調(diào))

其次,對于日歷中大家都知道的 大月 和 小月,這里也不再贅述。

在小月中有個特殊的 2月 ,它一個月只有28 或 29天,而其具體的天數(shù)根據(jù)是否為 閏年 來決定。

2.2 什么是閏年

我們通過計算方式的不同,將閏年分為 普通閏年 和 世紀閏年。

  • 普通閏年:公歷年份是4的倍數(shù),且不是100的倍數(shù)的,為閏年(如2004年、2020年等就是閏年)。
  • 世紀閏年:公歷年份是整百數(shù)的,必須是400的倍數(shù)才是閏年(如1900年不是閏年,2000年是閏年)。

2.3 正則表達式基礎(chǔ)

由于正則表達式的知識比較繁多,這里不做過多的介紹。只對本文將用到的表達式進行講解。

字符描述
|指明兩項之間的一個選擇,意為。
\d匹配一個數(shù)字字符。等價于 [0-9]。
{n}n 是一個非負整數(shù)。匹配確定的 n 次。
[1-9][1-9] 表示一個區(qū)間,匹配1-9的數(shù)字
[ABC]匹配 […] 中的所有字符,例如 [358] 匹配數(shù)字 3、5、8

接下來我們將這些簡單的字符進行一個組合,看看你是否還能理解他們的意思呢?

正則表達式描述舉例文本錯誤文本
\d{3}3個數(shù)字都是0-9的間的數(shù)字237、832、129a37、ufo
\d{3}[1-9]前3個數(shù)字都是0-9的間的數(shù)字,第四個數(shù)字是1-9直接的數(shù)字2372、4041、90018720、2020
[7-9]|[523]該數(shù)字要么是7-9之間的一個數(shù),要么是2,3,5其中的一個數(shù)字7、5、21、4、6

簡單的學會使用正則表達式了,那我們就開始正式的開始書寫吧。

3 構(gòu)造正則表達式

3.1 閏年的情況

為了方便后面的表示,我們將 yyyy 變?yōu)?y1y2y3y4

3.1.1 世紀閏年的情況

  • 世紀閏年:公歷年份是整百數(shù)的,必須是400的倍數(shù)才是閏年(如1900年不是閏年,2000年是閏年)。

由 世紀閏年 的定義我們可以知道,y3 和 y4 一定是0的,因此可得如下表格:

y1y2y3y4
待定待定00

現(xiàn)在來討論 y1 和 y2,由定義可知,我們可知 y1y2這個二位數(shù)一定是4的倍數(shù)。4的倍數(shù)的二位數(shù)一共有:

  • 04、08、12、16、20、
  • 24、28、32、36、40、
  • 44、48、52、56、60、
  • 64、68、72、76、80、
  • 84、88、92、96、

相信大家也看出規(guī)律了,因此可得如下表格:

y1y2y1y2y3y4
0[48]0[48]00
[2468][48][2468][048]00
[3579][48][3579][26]00

可以看到,此時有3種情況,這里我們用 | 將其聯(lián)系起來成為一條正則表達式,如下:

((0[48]|[2468][048]|[3579][26])00)

3.1.2 普通閏年的情況

  • 普通閏年:公歷年份是4的倍數(shù),且不是100的倍數(shù)的,為閏年(如2004年、2020年等就是閏年)。

因此在此我們只需要判斷,y1y2y3y4 是否為4的倍數(shù)即可,但這里也想上面把所有情況列出來找規(guī)律嗎?這里可是4位數(shù),情況將遠遠大于2位數(shù)的情況。這里我們來找找有沒有什么可以減少位數(shù)的方法呢?

所以 y1y200 不管 y1y2 為何值都為4的倍數(shù),可得下表:

y1y2y1y2y3y4
\d\d\d{2}待定待定

而我們可以知道,一個為4的倍數(shù)的數(shù),只有加上一個為4的倍數(shù),和才能為4的倍數(shù)。故我們現(xiàn)在只需要求 y3y4 為4的情況即可,我們按照之前列舉的方法可得如下表:

y1y2y1y2y3y4
\d\d\d{2}0[48]
\d\d\d{2}[2468][48]
\d\d\d{2}[13579][26]

這里我們用 | 將其聯(lián)系起來成為一條正則表達式,如下:

(\d{2})(0[48]|[2468][048]|[13579][26])

3.1.3 閏年的特殊日期

我們可以知道閏年的特殊之處在于2月29日 這一天是否存在,其他日子不存在閏年與平年的區(qū)別。因此我們只需要在閏年的情況下,判斷2月29日這一天的日子即可,故可得以下正則表達式:

世紀閏年:(\d{2})(0[48]|[2468][048]|[13579][26])0229
普通閏年:((0[48]|[2468][048]|[3579][26])00)0229

用 | 將其聯(lián)系起來成為一條正則表達式,如下:

(((\d{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229)

3.2 其他情況

現(xiàn)在解決了 2月29日 這個棘手的問題,對于其他日子,我們將不在區(qū)分閏年。看到這你是不是以為就可以直接 \d{4} 來表示y1y2y3y4 了?

看來你忽略了一個條件,在 2.2.1 中我們明確了時間的范圍為為 0001010199991231 ,但當 y1y2y3y4\d{4} 存在 0000 這個情況,顯然這個數(shù)據(jù)并不在我們合法的范圍中。

因此我們可以得到如下的表:

y1y2y3y4
\d\d\d[1-9]
\d\d[1-9]\d
\d[1-9]\d\d
[1-9]\d\d\d

用 | 將其聯(lián)系起來成為一條正則表達式,如下:

(\d{3}[1-9]|\d{2}[1-9]\d|\d[1-9]\d{2}|[1-9]\d{3})

然后就是構(gòu)造 的正則表達式了

3.2.1 大月

首先是大月為:01,03,05,07,08,10,12。

正則表達式如下:

(0[13578]|1[02])

大月每月的日子從1日-31日均有。

正則表達式如下:

(0[1-9]|[12]\d|3[01])

故大月的正則表達式為:

((0[13578]|1[02])(0[1-9]|[12]\d|3[01]))

3.2.2 小月

首先是小月為:02,04,06,09,11。(但2月的日子和其他小月不同,這里將排除掉2月)

正則表達式如下:

(0[469]|11)

小月(不含2月)每月的日子從1日-30日均有。

正則表達式如下:

(0[1-9]|[12]\d|30)

故小月(除2月)的正則表達式為:

(0[469]|11)(0[1-9]|[12]\d|30))

3.2.3 2月

因為前面我們已經(jīng)特殊表示了2月29日,所以這里我們只需要考慮2月的1日到28日,正則表達式如下:

(02(0[1-9]|[1]\d|2[0-8])

3.3 完整表達式

現(xiàn)在我們將全年的年月日均表達出來了,我們將其用 | 聯(lián)系起來可得如下正則表達式(不包含2月29日):

((\d{3}[1-9]|\d{2}[1-9]\d|\d[1-9]\d{2}|[1-9]\d{3})(((0[13578]|1[02])(0[1-9]|[12]\d|3[01]))|((0[469]|11)(0[1-9]|[12]\d|30))|(02(0[1-9]|[1]\d|2[0-8]))))

4 總結(jié)

經(jīng)過前面的努力,我們得到了如下的兩個表達式:

閏年2月29日情況:
(((\d{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229)
不含2月29日情況:
((\d{3}[1-9]|\d{2}[1-9]\d|\d[1-9]\d{2}|[1-9]\d{3})(((0[13578]|1[02])(0[1-9]|[12]\d|3[01]))|((0[469]|11)(0[1-9]|[12]\d|30))|(02(0[1-9]|[1]\d|2[0-8]))))

最終我們將這兩個情況,用 | 聯(lián)系起來,我們就得到了校驗日期的正則表達式了!

((\d{3}[1-9]|\d{2}[1-9]\d|\d[1-9]\d{2}|[1-9]\d{3})(((0[13578]|1[02])(0[1-9]|[12]\d|3[01]))|((0[469]|11)(0[1-9]|[12]\d|30))|(02(0[1-9]|[1]\d|2[0-8]))))|(((\d{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229)

到此這篇關(guān)于java正則表達式校驗日期格式的文章就介紹到這了,更多相關(guān)java正則校驗日期格式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java幾個實例帶你進階升華下篇

    Java幾個實例帶你進階升華下篇

    與其明天開始,不如現(xiàn)在行動,本文為你帶來幾個Java書寫的實際案例,對鞏固編程的基礎(chǔ)能力很有幫助,快來一起往下看看吧
    2022-03-03
  • springboot項目controller統(tǒng)一返回對象格式以及全局自定義異常方式

    springboot項目controller統(tǒng)一返回對象格式以及全局自定義異常方式

    本文介紹了在Web接口開發(fā)中,統(tǒng)一封裝接口返回數(shù)據(jù)格式和處理運行時異常的重要性,通過使用@ControllerAdvice和ResponseBodyAdvice,可以實現(xiàn)全局攔截和封裝,為了處理Swagger請求,提出了解決方案,包括對Swagger請求放行和自定義注解攔截特定接口
    2025-11-11
  • 詳解JVM 中的StringTable

    詳解JVM 中的StringTable

    這篇文章主要介紹了JVM 中的StringTable,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • SpringBoot集成swagger-ui以及swagger分組顯示操作

    SpringBoot集成swagger-ui以及swagger分組顯示操作

    這篇文章主要介紹了SpringBoot集成swagger-ui以及swagger分組顯示操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java實戰(zhàn)之醫(yī)院管理系統(tǒng)的實現(xiàn)

    Java實戰(zhàn)之醫(yī)院管理系統(tǒng)的實現(xiàn)

    這篇文章主要介紹了如何利用Java實現(xiàn)醫(yī)院管理系統(tǒng),文中用到的技術(shù)有:SpringBoot、Layui、Freemaker等,感興趣的同學可以了解一下
    2022-04-04
  • 使用springboot對linux進行操控的方法示例

    使用springboot對linux進行操控的方法示例

    這篇文章主要介紹了使用springboot對linux進行操控的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Jenkins安裝與配置及漢化過程

    Jenkins安裝與配置及漢化過程

    這篇文章主要介紹了Jenkins安裝與配置及漢化過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • mybatis中使用not?in與?in的寫法說明

    mybatis中使用not?in與?in的寫法說明

    這篇文章主要介紹了mybatis中使用not?in與?in的寫法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Springboot+MybatisPlus+Oracle實現(xiàn)主鍵自增的示例代碼

    Springboot+MybatisPlus+Oracle實現(xiàn)主鍵自增的示例代碼

    這篇文章主要介紹了Springboot+MybatisPlus+Oracle實現(xiàn)主鍵自增的示例代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Java并發(fā)線程間的通信最佳實踐

    Java并發(fā)線程間的通信最佳實踐

    這篇文章主要介紹了Java并發(fā)線程間的通信最佳實踐,本文將帶你全面了解線程間通信的原理、常見陷阱以及如何優(yōu)雅地實現(xiàn)線程協(xié)作,需要的朋友可以參考下
    2026-03-03

最新評論

曲阳县| 南溪县| 阳山县| 柳州市| 汝州市| 兴义市| 孟村| 云安县| 临清市| 淳化县| 石景山区| 瓮安县| 金阳县| 格尔木市| 北票市| 穆棱市| 宜丰县| 麟游县| 沽源县| 井陉县| 大方县| 聂荣县| 同江市| 盱眙县| 乐都县| 荔波县| 河南省| 睢宁县| 土默特左旗| 昌乐县| 友谊县| 深泽县| 富源县| 资溪县| 吴忠市| 嘉鱼县| 甘南县| 潼南县| 安福县| 陵水| 砚山县|