regex 正则表达式返回true,但?

mgdq6dx1  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(106)

我有日期字段为YYYYMMDD,它的定义:

zod.string().max(8).regex(new RegExp('^(19[0-9][0-9]|20[0-9][0-9]|[0-1][0-9]{3})(1[0-2]|0[1-9])(3[01]|[0-2][1-9]|[12]0)$'));

和价值20001915
我的意思是它的定义是确定的,在在线检查器测试([https://www.regextester.com/enter链接描述在这里] 1)告诉我(月数是假的- 19),但佐德通过这个值是正确的,为什么?

3qpi33ja

3qpi33ja1#

正如有人在评论中所说,正则表达式是正确的。但是,重要的是要注意,虽然zod正则表达式检查格式,但它并不根据真实世界的日期来验证日期本身的正确性。在您的示例中,值“20001915”具有正确的格式(YYYYMMDD),但它表示第19个月,该月不存在,因此外部在线检查器将其正确识别为“19”。
因此,您需要像下面这样单独验证日期:

const dateString = "20001915";
const year = parseInt(dateString.substring(0, 4));
const month = parseInt(dateString.substring(4, 6)) - 1; // Months are 0-indexed
const day = parseInt(dateString.substring(6, 8));

const date = new Date(year, month, day);

if (
  date.getFullYear() === year &&
  date.getMonth() === month &&
  date.getDate() === day
) {
  console.log("Valid date.");
} else {
  console.log("Invalid date.");
}

另外,你可以像这样优化正则表达式:

^(19\d\d|20\d\d)(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])$

相关问题