我们把一个出生日期以2018年6月15日的形式分为年、月、日三部分,分别写出相应的规则。
年份由4位数字组成。只接受以19和20开头的年份。根据上面的规则,很容易写出年份的正则表达式:
var模式=/^(19|20)d{2}$/;//输出true console . log(pattern . test(' 2008 '));其中//两个斜杠及其中间字符是正则表达式的直接量的定义;指示匹配字符串的开头,$指示匹配字符串的结尾;(19 | 20)表示匹配以19或20开头的字符串,一对括号用于将几个项目组合成一个单元;虽然d{2}表示将任何ASCII数字匹配两次,d相当于[0-9],而{2}表示将前一项匹配两次。
上面的正则表达式可以匹配1900年到2099年的年份。如果要限制年数范围,请添加以下规则:
这一年从1920年开始,到2018年结束。根据上述规则,更改正则表达式如下:
var模式=/^(19[2-9]d{1})|(20((0[0-9])|(1[0-8])))$/;//输出false console . log(pattern . test(' 1916 '));//输出true console . log(pattern . test(' 2008 '));//输出false console . log(pattern . test(' 2022 '));
月份可以从一月到十二月。如果是从1到9,可以在它之前添加0。根据上述规则,给出以下常规和简单测试:
var模式=/^((0?[1-9])|(1[0-2]))$/;//输出false console . log(pattern . test(' 19 '));//输出true console . log(pattern . test(' 02 '));//输出true console . log(pattern . test(' 2 '));//输出true console . log(pattern . test(' 11 '));
日期可以是1-31。如果日期是1-9,它可以以0开头。根据上述规则,给出以下常规和简单测试:
var模式=/^((0?[1-9])|([1-2][0-9])|30|31)$/;//输出false console . log(pattern . test(' 32 '));//输出true console . log(pattern . test(' 02 '));//输出true console . log(pattern . test(' 2 '));
var模式=/^((19[2-9]d{1})|(20((0[0-9])|(1[0-8]))))-((0?[1-9])|(1[0-2]))-((0?[1-9])|([1-2][0-9])|30|31)$/;//输出true console . log(pattern . test(' 1923-3-18 '));//输出true console . log(pattern . test(' 1923-4-31 '));//输出true console . log(pattern . test(' 1923-2-29 '));//输出true console . log(pattern . test(' 2016-2-29 '));从上述测试结果可以看出,上述定期验证并不完善,主要是由于2月、4月、6月、9月和11月的天数。
四月、六月、九月和十一月,没有31号。2月,平均一年28天。2月,闰年是29个平衡年。
被4整除的年份是闰年,不能被4整除的年份是正常年份。但如果是整整一百年,只要能除以400就是闰年,否则就是正常年份。
根据新的规则和说明,给出了以下常规功能和测试:
var check birth=function(val){ var pattern=/^((?19[2-9]d{1})|(?20(?(?0[0-9])|(?1[0-8]))))-((?0?[1-9])|(?1[0-2]))-((?0?[1-9])|(?[1-2][0-9])|30|31)$/;var result=val.match(模式);如果(结果!=null){ var iYear=parsent(结果[1]);var month=结果[2];var date=结果[3];if(/^((0?[469])|11)$/.测试(月)日期=='31') {返回false} else if(parsent(month)==2){ if((iYear % 4==0 iYear % 100!=0)| |(iYear % 400==0)){ if(date==' 29 '){ return true;} } if(ParSeint(date)28){ return false;} }返回true}返回false}//输出true console . log(check birth(' 1923年3月18日');//输出false没有console . log 4月31日(查出生(' 1923-4-31 ');//输出false normal console . log(check birth(' 1923-2-29 '));//输出真正的闰年console . log(check birth(' 2016-2-29 '));上面的正则表达式中使用了String的match()方法,该方法唯一的参数是正则表达式,它返回一个由匹配结果组成的数组。数组的第一个元素是匹配的字符串,其余元素是正则表达式中括号内的子表达式。还有(:这种组合会出现很多次,这意味着只能将项目组合成一个单元,而不能记住与该组匹配的字符.利用这种方法,以规则匹配的顺序提取年、月、日的项目,以便以后进行比较。
根据以上分析和测试,我们不仅实现了年、月、日的常规通用判断,还实现了2月、4月、6月、9月、11月等特殊月份的日期范围和天数的处理,测试结果达到了我们设定的目标。
根据以上解释和分析,我们可以调整相应的资质规则,以满足特定场景下项目的需求。
延长
根据V2EX网友香月村的意见,上面的checkBirth逻辑代码太多了,确实有点低。上述代码更新如下:
var check birth=function(val){ var pattern=/^((19[2-9]d{1})|(20((0[0-9])|(1[0-8]))))-((0?[1-9])|(1[0-2]))-((0?[1-9])|([1-2][0-9])|30|31)$/;if(pattern . test(val)){ var Date=new Date(val);var month=val . substring(val . indexof('-')1,val . last indexof('-'));返回日期(date . getmonth()1==parsent(month));}返回false}摘要
以上是边肖介绍的JavaScript一步步实现出生日期的正则表达式,希望对大家有所帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!