使用正则表达式验证日期格式dd/mm/YYYY、dd-mm-YYYY、dd.mm.YYYY、dd mmm YYYY、dd-mmm-YYYY、dd/mmm/YYYY、dd.mmm.YYYY,并支持闰年。

260

我需要使用正则表达式验证日期字符串的格式为dd/mm/yyyy

这个正则表达式可以验证dd/mm/yyyy格式,但无法验证无效的日期,比如31/02/4500

^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$

有哪些有效的正则表达式可以验证带闰年支持的dd/mm/yyyy格式?


3
我认为,如果您设置一个准确的期望值,可能会有所帮助,因为此正则表达式实际上并没有正确验证闰年;例如,2013年没有2月29日,但是此正则表达式声称这是有效的:http://regexr.com?346fp - TML
11
为什么要用正则表达式?还有更简单(且更准确)的方法... - Dan Puzey
3
正则表达式用于匹配模式,而不是检查数字值。使用正则表达式找到一个可能的字符串,然后在您所使用的托管语言(如PHP等)中检查其数值。 - Andy Lester
3
此答案已添加到 Stack Overflow 正则表达式 FAQ 中的“常见验证任务”下。 - aliteralmind
4
你错了。正则表达式是验证的最佳工具,因为HTML5输入有一个名为“pattern”的属性,它接受一个正则表达式,浏览器会自动根据正则表达式进行验证,而无需使用任何JavaScript。只需在pattern属性中设置一个正则表达式即可。 - awe
显示剩余6条评论
28个回答

0

对于日期 MM/DD/YYYY,您可以使用

^((((0[13578])|([13578])|(1[02]))[\/](([1-9])|([0-2][0-9])|(3[01])))|(((0[469])|([469])|(11))[\/](([1-9])|([0-2][0-9])|(30)))|((2|02)[\/](([1-9])|([0-2][0-9]))))[\/]\d{4}$|^\d{4}$

它验证正确的日期和月份。

记住,您可以在

regex101

检查您的正则表达式,我推荐使用 :)

玩得开心!


0
^(((([13578]|0[13578]|1[02])[-](0[1-9]|[1-9]|1[0-9]|2[0-9]|3[01]))|(([469]|0[469]|11)[-]([1-9]|1[0-9]|2[0-9]|3[0]))|((2|02)([-](0[1-9]|1[0-9]|2[0-8]))))[-](19([6-9][0-9])|20([0-9][0-9])))|((02)[-](29)[-](19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048])))

这个正则表达式将验证以下日期格式:

12-30-2016(月-日-年)或 12-3-2016(月-日-年)或 1-3-2016(月-日-年)或 1-30-2016(月-日-年)


0
((((0[13578]|1[02])\/(0[1-9]|1[0-9]|2[0-9]|3[01]))|((0[469]|11)\/(0[1-9]|1[0-9]|2[0-9]|3[0]))|((02)(\/(0[1-9]|1[0-9]|2[0-8]))))\/(19([6-9][0-9])|20([0-9][0-9])))|((02)\/(29)\/(19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048])))

将使用MM/DD/YYYY格式验证19602028年。

如果需要扩展闰年支持,请添加。

19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048]|3[26]|4[048])))

这也是有效的工作

^((((0[13578]|1[02])[/](0[1-9]|1[0-9]|2[0-9]|3[01]))|((0[469]|11)[/](0[1-9]|1[0-9]|2[0-9]|3[0]))|((02)([/](0[1-9]|1[0-9]|2[0-8]))))[/](19([6-9][0-9])|20([0-9][0-9])))|((02)[/](29)[/](19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048])))

如果你想更改日期格式为 mm-dd-yyyy,那么请将 [/] 替换为 [-]。同时可以在 http://regexr.com/ 上进行在线检查。


0

这是一个正则表达式,用于匹配不同分隔符的日期格式字符串YYYY-MM-DD。它可以在句子中匹配字符串,并且可以匹配以stnd和其他字符结尾的日期。

例如,它可以匹配以下句子中的日期:

"Her birthday is 2022 February 23rd; I will present here a gift."

"Her birthday is 2022 Feb 23rd; I will present here a gift."

"Her birthday is 2022 02 23; I will present here a gift."

这是日期正则表达式:

"\b
(?<YYYY>[0-9]{4})
(?<!0000)(?<sep>[ /.,-])
(?|
    (?:(?<MM>0[13578]|1[02]|Jan(?:uary)?|Mar(?:ch)?|May|Jul(?:y)?|Aug(?:ust)?|Oct(?:ober)?|Dec(?:ember)?)\g{sep}(?<DD>0[1-9]|[12][0-9]|3[01]))|
    (?:(?<MM>0[469]|11|Apr(?:il)?|Jun(?:e)?|Sep(?:tember)?|Nov(?:ember)?)\g{sep}(?<DD>0[1-9]|[12][0-9]|30))|
    (?:(?<MM>02|Feb(?:ruary)?)\g{sep}(?<DD>0[1-9]|[12][0-9]))
)
(?:
    (?<=[023][1])st|
    (?<=[02][2])nd|
    (?<=[02][3])rd|
    (?<=(?:0[4-9])|(?:1[0-9])|20|(?:2[4-9])|30)th
)?
[,;.]?
\b"x

在我看来,使用正则表达式检查闰年没有意义,因为可以写一个简单、清晰且易懂的一行代码来实现:

is_leap_year(y) = ((y%4 == 0) && (y%100 != 0)) || (y%400 == 0)

正则表达式用于匹配字符串,而不是进行计算。最好的方法是匹配字符串,然后将捕获的MM组传递给is_leap_year函数,如果它是02FebFebruary,以验证字符串。


0

我知道这个回答跟问题有些偏离,但如果问题的意图是“如何验证日期?”,那么为什么不让编程语言来完成所有艰巨的工作(如果你使用的是能够实现该功能的语言)呢?

例如,在PHP中:

$this_date_object = date_create($this_date);

if ($this_date_object == false )
    {

        // process the error

    }

0

我知道这个问题已经有很长时间没有回答了,但也许这可以帮助其他人。我的意图是想检查年份,并让一些过去的年份也匹配。这个正则表达式匹配格式为"DD-MM-YYYY"的日期。因此,这个函数将返回一个正则表达式

const check_year = "01-01-2021"

console.log(get_regex())
console.log(check_year.match(get_regex()))

function get_regex(){
    let actual_year = `${new Date().getFullYear()}`
    let regex = new RegExp()
    let split_year = actual_year.split("")
    let year_regex = `${split_year[0]}[0-${split_year[1]}][0-${split_year[2]}][0-${split_year[3]}]$`
    let day_month_regex = "^([1-2][0-9]|3[0-1]|0?[1-9])[-]([1][0-2]|0?[1-9])[-]"

    regex.compile(day_month_regex+year_regex, "g")

    return regex
}


0

仅限当天使用:

<input placeholder="day" maxlength="2" minlength="1" formControlName="birthDay" 
   name="birthDay"pattern="(0[1-9]|1[0-9]|2[0-9]|3[0-1])" >/

仅限本月使用:

 <input placeholder="month" maxlength="2" minlength="1" 
  formControlName="month" name="month" formControlName="month" name="month" pattern="(0[1- 
  9]|1[0-2])">/

0
/(0[1-9]|[12][0-9]|3[01])\-(0[1-9]|1[0,1,2])\-(19|20)\d{2}/

试一下这个正则表达式,它会工作 ---> 24-02-1992

示例链接 https://regex101.com/r/6BmyWe/1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接