正则匹配yyyy-mm-dd以及数字千分位详解

一、yyyy-mm-dd

年:0000-9999 月:00-12
日:1、3、5、7、8、10、12 31-天 4、6、9、11 30-天 2 28-天 闰年29-天
我们分成三部分:
1部分是闰年-能被400整除 2月包括29天
2部分是闰年能被4整除但不能被100整除 2月包括29天
3部分是平年

1.被400整除,前两位是4的倍数,后两位是0

先看4的倍数:00不算
找规律
04 24 44
08 28 48
12 32 52
16 36 56
20 40 60 。。。。。。
可以看出个位及十位都是有规律的 0[48],1[26],2[048],3[26]
表达成正则为:/(0[48]|[2468][048]|[1357][26])00/ 不包含00

2.被4整除不能被100整除

100能被4整除,所以前两位可以是任何数,只要后面是4的倍数就行
可表示为:
/(\d\d(0[48]|[2468][048]|[1357][26]))/

3.四位随机

可表示为:
/\d{4}/

4.月+日表示:

1、3、5、7、8、10、12 :/(0[13578]|1[02])-(0[1-9]|1\d|2\d|31)/
4、6、9、11:/(0[469]|11)-(0[1-9]|1\d|2\d|30)/
2-28天:/02-(0[1-9]|1\d|2[0-8])/
2-29天:/02-(0[1-9]|1\d|2\d)/ (闰月)
合并表示:
润:
/((0[13578]|1[02])-(0[1-9]|1\d|2\d|31)|(0[469]|11)-(0[1-9]|1\d|2\d|30)|02-(0[1-9]|1\d|2\d))/
^润:
/(0[13578]|1[02])-(0[1-9]|1\d|2\d|31)|(0[469]|11)-(0[1-9]|1\d|2\d|30)|02-(0[1-9]|1\d|2[0-8])/
若不包含^与&的话
合并的答案为:
400 + 4 ^100 + ^润(闰年的年用|合一起,月是一样的)
/(
(((0[48]|[2468][048]|[1357][26])00 | \d\d(0[48]|[2468][048]|[1357][26]))-((0[13578]|1[02])-(0[1-9]|1\d|2\d|31)
|(0[469]|11)-(0[1-9]|1\d|2\d|30)|02-(0[1-9]|1\d|2\d))
|\d{4}-(0[13578]|1[02])-(0[1-9]|1\d|2\d|31)|(0[469]|11)-(0[1-9]|1\d|2\d|30)|02-(0[1-9]|1\d|2[0-8])
)/g
去掉空格:
/(((0[48]|[2468][048]|[1357][26])00|\d\d(0[48]|[2468][048]|[1357][26]))-((0[13578]|1[02])-(0[1-9]|1\d|2\d|31)|(0[469]|11)-(0[1-9]|1\d|2\d|30)|02-(0[1-9]|1\d|2\d))|\d{4}-(0[13578]|1[02])-(0[1-9]|1\d|2\d|31)|(0[469]|11)-(0[1-9]|1\d|2\d|30)|02-(0[1-9]|1\d|2[0-8]))/g
除//g外总长度为246个字符

其实到这里还可以优化正则,再想想,闰年不就比平年多了一天,多了哪一天?

yyyy-mm-dd答案为:

/(
((0[48]|[2468][048]|[1357][26])00|\d\d(0[48]|[2468][048]|[1357][26]))
-02-29
|
\d{4}-(0[13578]|1[02])-(0[1-9]|1\d|2\d|31)|(0[469]|11)-(0[1-9]|1\d|2\d|30)|02-(0[1-9]|1\d|2[0-8])
)/g
去掉空格:
/(((0[48]|[2468][048]|[1357][26])00|\d\d(0[48]|[2468][048]|[1357][26]))-02-29|\d{4}-(0[13578]|1[02])-(0[1-9]|1\d|2\d|31)|(0[469]|11)-(0[1-9]|1\d|2\d|30)|02-(0[1-9]|1\d|2[0-8]))/g
除//g外总长度为167个字符

二、数字千分位

此题目我以前在自学网课时遇到过,当时老师说这是一些大厂的面试题,老师讲过后还留有一些印象,所以答起来有思路。
审题:1234567890 1.234.567.890
以前的解题思路是变数组、翻转、插入.、再翻转、变字符串
现在的解题思路是:从前往后看,后数3的倍数位前面加一.
正向预查(?=)是个好东西,它可以提前检测但不会匹配出来!具体看:
正向预查与反向预查
(正向预查内是不会被匹配出来的,其实就是在边界往后看,匹配的是边界,?=后跟着的是匹配条件)

利用replace以及匹配的回溯引用$1。。。进行替换
replace函数第一个参数可以写正则表达式,replace第二个参数可以传字符串或者回调函数,利用$1。。。$9可以匹配到的匹配的值,可用match或在回调打印arguments。
在这里插入图片描述

可理解为参数1+条件g,参数2回调函数循环匹配该正则
解题:
正向预查内部预查三位,0或多位,而且最后面跟着结束符
/(\d{3})KaTeX parse error: Undefined control sequence: \d at position 15: / 加上正向预查 /(?=(\̲d̲{3})*)/
加上边界,以3位数为边界,前面要是2、1、0位则不匹配
/\d{3}(?=(\d{3})
KaTeX parse error: Undefined control sequence: \d at position 58: …数循环匹配,正则可表示为: /\̲d̲{3}(?=(\d{3})*)/g
‘121123324113’.replace(/\d{3}(?=(\d{3})*$)/g, ($1)=>‘.’+$1)
到这里可以发现3的倍数位字符串,数首位也被匹配出来了
在这里插入图片描述

因为是非起始,所以不能由起始开始匹配
所以最终答案是:
/(?!^)\d{3}(?=(\d{3})*$)/g

‘1131231201’.replace(/(?!^)\d{3}(?=(\d{3})*$)/g, ($1)=>‘.’+$1)
前端小白一枚,由于公司培训出题,答题后自我感觉良好,所以发出来请各位大佬指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值