JavaScript分步实现出生日期正则表达式校验

作者:拾光

时间:2026-10-23

浏览:124

本文详细讲解如何在JavaScript中分步构建出生日期正则表达式。从年份、月份、日期的独立正则编写开始,逐步组合并处理大小月天数及闰年逻辑,最终提供两种实现方案:一种基于复杂的正则捕获组进行逻辑判断,另一种结合Date对象简化代码。

文章目录

简言

在表单验证场景中,经常需要使用正则表达式来校验出生日期。本文将出生日期拆解为年份、月份和日期三个部分,逐步介绍构建完整出生日期校验正则表达式的过程。理解本文内容后,您将能更深入地掌握正则表达式的编写技巧,并增强编写复杂正则的信心。

简言

我们将形式如 2018-06-15 的出生日期分割为年份、月份和日期三个组成部分,分别编写相应的正则表达式。

1 年份正则

首先定义年份正则表达式的规则:

  • 年份由4位数字组成。
  • 仅接受以19或20开头的年份。

根据上述规则,年份的正则表达式如下:


var pattern = /^(19|20)\d{2}$/;
//输出 true
console.log(pattern.test("2008"));

其中/ /两个斜杠及中间字符构成正则直接量;^表示匹配字符串开头,$表示匹配字符串结尾;^(19|20)表示匹配以19或20开头的字符串,小括号将几项组合为一个单元;\d{2}表示匹配任意ASCII数字2次,\d等价于[0-9],{2}表示匹配前一项2次。

上述正则可匹配1900至2099年的年份。若需限制具体范围,增加以下规则:

  • 年份起始于1920年。
  • 年份终止于2018年。

根据新规则,正则表达式变更为:


var pattern = /^(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"));

2 月份正则

首先定义月份正则表达式的规则:

  • 月份范围是1-12。
  • 若月份为1-9,前面可加0。

根据规则,给出如下正则及简单测试:


var pattern = /^((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"));

3 日期正则

首先定义日期正则表达式的规则:

  • 日期范围是1-31。
  • 若日期为1-9,前面可加0。

根据规则,给出如下正则及简单测试:


var pattern = /^((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"));

4 组合校验

将年份、月份、日期正则组合,形成出生日期的正则表达式:


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)$/;
//输出 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月的天数限制。

5 完善

针对第4步的问题,增加以下限定规则:

  • 4、6、9、11月没有31日。
  • 平年2月有28天。
  • 闰年2月有29天。

平年与闰年的判定规则如下:

能被4整除的年份是闰年,不能被4整除的是平年。但如果是整百年,只有能被400整除的才是闰年,否则为平年。

根据新增规则及说明,给出以下正则函数及测试:


var checkBirth = 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(pattern);
  if(result != null) {
    var iYear = parseInt(result[1]);
    var month = result[2];
    var date = result[3];
    if(/^((0?[469])|11)$/.test(month) && date == '31') {
      return false;
    } else if(parseInt(month) == 2){
      if((iYear % 4 ==0 && iYear % 100 != 0) || (iYear % 400 == 0)) {
        if(date == '29') {
          return true;
        }
      }
      if(parseInt(date) > 28) {
        return false;
      }
    }
    return true;
  }
  return false;
}
//输出 true
console.log(checkBirth("1923-3-18"));
//输出 false 4月份没有31日
console.log(checkBirth("1923-4-31"));
//输出 false 平年
console.log(checkBirth("1923-2-29"));
//输出 true 闰年
console.log(checkBirth("2016-2-29"));

上述正则利用了String的match()方法,该方法接收一个正则表达式作为唯一参数,返回由匹配结果组成的数组。数组第一个元素是匹配的字符串,后续元素是圆括号括起来的子表达式。(?:...)形式多次出现,表示将项组合为单元但不记忆匹配字符。利用该方法按正则匹配顺序分别取出年月日项,以便后续比较。

通过上述分析与测试,我们不仅实现了年月日的正则一般判定,还处理了日期范围及2、4、6、9、11月等特殊月份的天数问题,测验结果达到设定目标。

根据上述讲解和分析,可调整相应限定规则,以满足特定场景下的项目需求。

延伸

根据V2EX网友xiangyuecn的意见,上述checkBirth逻辑代码过多,确实略显繁琐。现将代码更新如下:


var checkBirth = 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.lastIndexOf("-"));
    return date && (date.getMonth()+1 == parseInt(month));
  }
  return false;
}

总结

以上介绍了JavaScript分步实现出生日期正则表达式的方法,希望对大家有所帮助。如有任何疑问,请留言,小编会及时回复。感谢大家对本站的支持!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章