正規表示式在日期處理的乙個應用

2021-09-13 19:39:48 字數 1892 閱讀 1582

最近在翻看原來寫的工具函式中,發現了formatdate這個工具函式,原來只是在使用,具體的實現原理沒有仔細研究過,這次就來分析一下它的實現,了解一下正規表示式的乙個實戰應用。

formatdate函式接受兩個引數,日期物件和格式引數,可以根據不同的格式引數將事件物件轉換成日期格式,大致使用如下

formatdate(new date(), 'yy-mm-dd')    // 18-05-13

formatdate(new date(), 'yyyy-mm-dd hh:mm') // "2018-05-13 16:35"

當然也可以把函式掛載在prototype上面,這樣就只需要乙個引數了,這個後續再說。

實現思路比較簡單,就是利用,date提供的函式,比如getmonthgetfullyear等函式先把date物件拆解出必要的部分。年月日小時分鐘秒等,然後再根據傳入的引數進行組合,得到想要的效果。這裡有幾個處理過程中需要注意的地方。

formatdate(new date(), 'yyyy-m-dd') // "2018-5-13"

formatdate(new date(), 'yyyy-mm-dd') // "2018-05-13"

因為需要支援各種組合,所以需要乙個物件將個部分儲存下來,根據引數的格式能夠快速的解析出來對應的值。物件的格式大致如下

var cfg =
雙位補0單位不補0,補0的過程封裝成乙個函式paddnum,自然想到的是用正規表示式來判斷是否是1位,很容易寫出如下**

let paddnum = num => 

return num

}

不過還可以使用字串提供的正規表示式replace功能簡化這個過程,使用捕獲組來獲取匹配的值,再+0,如果沒有匹配,就返回本身,這也正是我們想要的,這裡提前需要把數字轉換成字串。

let paddnum = num => num.tostring().replace(/^(\d)$/, '0$1')
這樣每個日期的資料處理部分就做完了。

下面實現日期格式的解析,要把傳入的日期格式做匹配,然後從物件解析出對應的值,再拼到一塊。

分析傳入日期的格式,都是yyyydd這種重疊的格式,這就需要針對每乙個匹配出來的值,都要匹配到與其相同的一組值,也就是如果匹配到y,那就要把緊跟在y後面所有的y都匹配出來,比如yyyyyy等,直到遇到首個不是y的字元停止。這就需要在匹配環節記住匹配的部分並重複匹配,捕獲組又派上了用場。/([a-z])(\1)*/\1可以代替匹配到的字元,進而組成新的匹配條件,這樣的匹配條件就是那種想要的重疊格式了。

所以解析的過程如下

format.replace(/([a-z])(\1)*/ig, m => cfg[m])
稍作整理,這個工具函式就組合起來了

const formatdate = (date=new date(), format='yyyy-mm-dd hh:mm:ss') => 

return format.replace(/([a-z])(\1)*/ig, m => cfg[m])

}

可以看出用好正規表示式的捕獲組,可以大大簡化**量,邏輯看上去也很清楚。

正規表示式 日期

1 日期範圍 datetime 值型別表示值範圍在公元 紀元 0001 年 1 月 1 日午夜 12 00 00 到公元 c.e.9999 年 12 月 31 日晚上 11 59 59 之間的日期和時間。2 閏年 關於公曆閏年是這樣規定的 地球繞太陽公轉一周叫做一回歸年,一回歸年長365日5時48分...

日期正規表示式

判斷閏年的規則 1 能被400整除 2 能被4整除不能被100整除 日期正規表示式的構建思想 平年365天,閏年366天,只有在閏年的時候,2月有29天,其餘年份,2月總是只有28天,而其餘月份是的天數是一樣的。那麼,只需要對所有的年份 包括閏年 構建出2月只有28天 其餘月份正常表示 的正規表示式...

正規表示式應用(一)

分類名稱 說明 正規表示式 情侶專屬號 尾數 7位數中,存在 520的情侶專屬號段 520 四連號 尾數 7位中含 4個連續數字全相同 aaaa d 1 福運號 尾數 7位中含兩組 3個連續數字全相同 aaa bbb d 1 d d 3 如意號 尾數 7位數中,存在aabbccc aacccbb c...