225

我需要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具有闰年支持的格式?

4

25 回答 25

403

您粘贴的正则表达式没有正确验证闰年,但在同一篇文章中有一个。我将其修改为dd/mm/yyyy,dd-mm-yyyydd.mm.yyyy.

^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[13-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

我在 Arun 在他的答案和这里提供的链接中对其进行了一些测试,它似乎有效。

编辑 2019 年 2 月 14 日:我删除了正则表达式中的逗号,它允许日期如下29-0,-11

于 2013-03-19T16:19:55.663 回答
280

我已经根据我的要求扩展了@Ofir Luzon 为 dd-mmm-YYYY、dd/mmm/YYYY、dd.mmm.YYYY 格式提供的正则表达式。其他有相同要求的可以参考这个

^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]|(?:Jan|Mar|May|Jul|Aug|Oct|Dec)))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2]|(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)(?:0?2|(?:Feb))\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep))|(?:1[0-2]|(?:Oct|Nov|Dec)))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

并在这里测试了一些测试用例https://regexr.com/39tr1

为了更好地理解此正则表达式,请参阅此图像:

在此处输入图像描述

编辑

为 yyyy/mm/dd、yyyy-mm-dd 或 yyyy.mm.dd 扩展一些测试用例https://regex101.com/r/3TZfyU/1

^(?:(?:1[6-9]|[2-9]\d)?\d{2})(?:(?:(\/|-|\.)(?:0?[13578]|1[02])\1(?:31))|(?:(\/|-|\.)(?:0?[13-9]|1[0-2])\2(?:29|30)))$|
^(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(\/|-|\.)0?2\3(?:29)$|
^(?:(?:1[6-9]|[2-9]\d)?\d{2})(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:0?[1-9]|1\d|2[0-8])$
于 2014-11-17T11:56:10.270 回答
80

注意:

您的正则表达式在“是 4 和 100 的倍数,但不是 400 的倍数”的年份中不起作用。通过该测试的年份不是闰年。例如:1900, 2100, 2200, 2300, 2500 等。换句话说,它将所有格式为 \d\d​​00 的年份放在同一类闰年中,这是不正确的。– 多学习

所以它只适用于 [1901 - 2099] (Whew)

日/月/年:

检查是否闰年。从 1900 年到 9999 年有效。仅 dd/MM/yyyy

(^(((0[1-9]|1[0-9]|2[0-8])[\/](0[1-9]|1[012]))|((29|30|31)[\/](0[13578]|1[02]))|((29|30)[\/](0[4,6,9]|11)))[\/](19|[2-9][0-9])\d\d$)|(^29[\/]02[\/](19|[2-9][0-9])(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)$)
于 2013-12-25T13:47:43.650 回答
27

试试这个。

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

您可以在http://www.regular-expressions.info/javascriptexample.html轻松测试正则表达式。

于 2013-03-19T05:16:58.920 回答
13

对于那些看到这些并完全困惑的人,这里是我脚本的摘录。不幸的是,它所做的只是匹配日期时间输入中的有效数字,并且 2 月 31 日将被标记为有效,但正如许多人所说,正则表达式确实不是进行此测试的最佳工具。

匹配格式为 'yyyy-MM-dd hh:mm' 的日期(或者实际上以您喜欢的任何顺序)

var dateerrors = false;
var yearReg = '(201[4-9]|202[0-9])';            ///< Allows a number between 2014 and 2029
var monthReg = '(0[1-9]|1[0-2])';               ///< Allows a number between 00 and 12
var dayReg = '(0[1-9]|1[0-9]|2[0-9]|3[0-1])';   ///< Allows a number between 00 and 31
var hourReg = '([0-1][0-9]|2[0-3])';            ///< Allows a number between 00 and 24
var minReg = '([0-5][0-9])';                    ///< Allows a number between 00 and 59
var reg = new RegExp('^' + yearReg + '-' + monthReg + '-' + dayReg + ' ' + hourReg + ':' + minReg + '$', 'g');
$('input').filter(function () {return this.id.match(/myhtml_element_with_id_\d+_datetime/);}).each(function (e) {
    if (e > 0) {
        // Don't test the first input. This will use the default
        var val = $(this).val();
        if (val && !val.trim().match(reg)) {
            dateerrors = true;
            return false;
        }
    }
});
if (dateerrors) {
    alert('You must enter a validate date in the format "yyyy-mm-dd HH:MM", e.g. 2019-12-31 19:30');
    return false;
}

上面的脚本从构建一个正则表达式对象开始。然后它会找到所有 id 与某个模式匹配的输入,然后遍历这些输入。我不测试我找到的第一个输入 ( if (e > 0))。

一点解释:

var reg = new RegExp('^' + yearReg + '-' + monthReg + '-' + dayReg + ' ' + hourReg + ':' + minReg + '$', 'g');

^表示比赛开始,而$表示比赛结束。

return this.id.match(/myhtml_element_with_id_\d+_datetime/);

\d+表示匹配单个或连续的整数序列,因此myhtml_element_with_id_56_datetimemyhtml_element_with_id_2_datetime将匹配,但myhtml_element_with_id_5a_datetime不会

于 2014-03-28T17:08:48.227 回答
13

我怀疑以下内容与预期的一样准确,但不知道用户的语言环境何时从儒略历切换到公历。

无论顺序如何,它都接受“-”、“/”或不接受任何东西作为年、月和日之间的分隔符。

MMddyyyy:

^(((0[13-9]|1[012])[-/]?(0[1-9]|[12][0-9]|30)|(0[13578]|1[02])[-/]?31|02[-/]?(0[1-9]|1[0-9]|2[0-8]))[-/]?[0-9]{4}|02[-/]?29[-/]?([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048]|0[0-9]|1[0-6])00))$

ddMMyyyy:

^(((0[1-9]|[12][0-9]|30)[-/]?(0[13-9]|1[012])|31[-/]?(0[13578]|1[02])|(0[1-9]|1[0-9]|2[0-8])[-/]?02)[-/]?[0-9]{4}|29[-/]?02[-/]?([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048]|0[0-9]|1[0-6])00))$

yyyyMMdd:

^([0-9]{4}[-/]?((0[13-9]|1[012])[-/]?(0[1-9]|[12][0-9]|30)|(0[13578]|1[02])[-/]?31|02[-/]?(0[1-9]|1[0-9]|2[0-8]))|([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048]|0[0-9]|1[0-6])00)[-/]?02[-/]?29)$

除了顺序之外,这些都准确到儒略历(每四年闰年),直到 1700 年公历与儒略历不同。它有两个问题:

  1. 它接受 0000 年,这在许多(但不是全部)标准中并不存在。请注意,ISO 8601 确实接受 0000 年(相当于 1 BCE)。
  2. 它不会跳过公历开始使用时丢失的 10-13 天。不过,这因地区而异。例如,罗马天主教会跳过了 10 天,即 1582 年 10 月 5 日至 10 月 14 日,但希腊(最后一个转换)跳过了 1923 年 2 月 16 日至 28 日,即 13 天,必须考虑到 1700 年的闰年, 1800 年和 1900 年。

这已经针对从 0001 年到 9999 年的 Java 日历实现进行了测试,唯一的差异是上述 1582 年的 10 天。

于 2015-07-23T19:38:31.570 回答
9

这是另一个版本的正则表达式,用于匹配以下任何日期格式并允许省略前导零:

正则表达式: ^[0-3]?[0-9].[0-3]?[0-9].(?:[0-9]{2})?[0-9]{2}$

火柴:

1/1/11 or 1.1.11 or 1-1-11 : true 01/01/11 or 01.01.11 or 01-01-11 : true 01/01/2011 or 01.01.2011 or 01-01-2011 : true 01/1/2011 or 01.1.2011 or 01-1-2011 : true 1/11/2011 or 1.11.2011 or 1-11-2011 : true 1/11/11 or 1.11.11 or 1-11-11 : true 11/1/11 or 11.1.11 or 11-1-11 : true

正则表达式可视化

调试演示

于 2015-04-15T11:14:14.040 回答
7

在这里,我为dd/mm/yyyywhere separator 可以是-.,/year range之一写了一个0000-9999

它处理闰年,专为正则表达式风格而设计,支持前瞻、捕获组和反向引用。不适用于d/m/yyyy. 如果需要,添加更多分隔符[-.,/]

^(?=\d{2}([-.,\/])\d{2}\1\d{4}$)(?:0[1-9]|1\d|[2][0-8]|29(?!.02.(?!(?!(?:[02468][1-35-79]|[13579][0-13-57-9])00)\d{2}(?:[02468][048]|[13579][26])))|30(?!.02)|31(?=.(?:0[13578]|10|12))).(?:0[1-9]|1[012]).\d{4}$

在 regex101 进行测试;作为 Java 字符串:

"^(?=\\d{2}([-.,\\/])\\d{2}\\1\\d{4}$)(?:0[1-9]|1\\d|[2][0-8]|29(?!.02.(?!(?!(?:[02468][1-35-79]|[13579][0-13-57-9])00)\\d{2}(?:[02468][048]|[13579][26])))|30(?!.02)|31(?=.(?:0[13578]|10|12))).(?:0[1-9]|1[012]).\\d{4}$"

解释:

(?x) # modifier x: free spacing mode (for comments)
     # verify date dd/mm/yyyy; possible separators: -.,/
     # valid year range: 0000-9999

^    # start anchor

# precheck xx-xx-xxxx,... add new separators here
(?=\d{2}([-.,\/])\d{2}\1\d{4}$)

(?:  # day-check: non caturing group

  # days 01-28
  0[1-9]|1\d|[2][0-8]| 

  # february 29d check for leap year: all 4y / 00 years: only each 400
  # 0400,0800,1200,1600,2000,...
  29
  (?!.02. # not if feb: if not ...
    (?!
      # 00 years: exclude !0 %400 years
      (?!(?:[02468][1-35-79]|[13579][0-13-57-9])00)

      # 00,04,08,12,... 
      \d{2}(?:[02468][048]|[13579][26])
    )
  )|

  # d30 negative lookahead: february cannot have 30 days
  30(?!.02)|

  # d31 positive lookahead: month up to 31 days
  31(?=.(?:0[13578]|10|12))

) # eof day-check

# month 01-12
.(?:0[1-9]|1[012])

# year 0000-9999
.\d{4}

$ # end anchor

另请参阅SO 正则表达式常见问题解答;请让我知道,如果它失败了。

于 2014-09-13T13:38:24.323 回答
6

在这里找到这个 reg ex

^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$

这会正确验证格式mm/dd/yyyy和有效日期(但不是m/d/yyyy)。

一些测试

于 2013-03-19T15:46:29.197 回答
5
"^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((19|20)\\d\\d)$"

将验证之间的任何日期1900-2099

于 2014-05-09T12:17:02.923 回答
5

以下表达式很好且易于操作:

((((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[0-9]|1[0-4])))|((02)(\/|-|.)(29)(\/|-|.)(19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26])))

它根据 MM/dd/YYYY 格式进行验证,并允许从 1960 年到 2016 年的闰年支持。如果您需要扩展闰年支持,您只需操作表达式的这一部分:

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

希望这对你有很大帮助

于 2014-06-02T11:21:04.970 回答
3

另一个答案根据月份 (mm) 和年份 (yyyy) 验证日 (dd)(即,也验证闰年的 2 月 29 日),并允许从 0001 到 9999 的年份(根据公历,在无效年份中为 0000日历)

^(?:(?:(?:0[1-9]|[12]\d|3[01])/(?:0[13578]|1[02])|(?:0[1-9]|[12]\d|30)/(?:0[469]|11)|(?:0[1-9]|1\d|2[0-8])/02)/(?!0000)\d{4}|(?:(?:0[1-9]|[12]\d)/02/(?:(?!0000)(?:[02468][048]|[13579][26])00|(?!..00)\d{2}(?:[02468][048]|[13579][26]))))$
于 2014-03-21T09:14:06.307 回答
2

根据我的说法,最好的方法是通过指定格式并使用严格解析来使用 Moment.js isValid() 方法。

正如 moment.js 文档所说

从 2.3.0 版本开始,您可以为最后一个参数指定一个布尔值,以使 Moment 使用严格解析。严格解析要求格式和输入完全匹配,包括分隔符。

value = '2020-05-25';
format = 'YYYY-MM-DD';
moment(value, format, true).isValid() // true
于 2020-08-18T16:44:10.290 回答
1

我正在使用接受 MM/DD/YYYY 格式的 API。我找不到任何其他能像Ofir 的回答一样闰年的帖子,所以我对其进行了调整,并在此处重新发布给任何可能需要它的人。

/^(?:(?:(?:0[13578]|1[02])(\/)31)\1|(?:(?:0[1,3-9]|1[0-2])(\/)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:02(\/)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/)(?:0[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/
于 2015-07-24T14:42:26.303 回答
1
import re
expression = "Nov 05 20:10:09 2020"
reg_ex = r'((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ([0-2][0-9]|(3)[0-1]) (([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])) (\d{4}))'
assert re.fullmatch(reg_ex, expression), True

关于给定示例的解释

  • 十一月=A group of possible months i.e. (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)
  • 05 =A group of valid days i.e. ([0-2][0-9]|(3)[0-1])
  • 20:10:09 =A group for getting valid Hours : ([0-1][0-9]|2[0-3]), Minutes : ([0-5][0-9]) and Seconds : ([0-5][0-9])
  • 2020 =A group for getting year i.e (\d{4}))
于 2020-11-06T13:36:27.000 回答
1

请关注表情

Regex regex = new Regex(@"(((0|1)[0-9]|2[0-9]|3[0-1])\/(0[1-9]|1[0-2])\/((19|20)\d\d))$");
于 2020-11-28T11:45:47.600 回答
1

进一步扩展了@AlokChaudhary 给出的正则表达式以支持:

1. dd mmm YYYY(除了dd-mmm-YYYY, dd/mmm/YYYY, dd.mmm.YYYY)。

2.所有大写字母格式的mmm(除了标题格式)

dd mmm YYYY例如30 Apr 202624 DEC 2028很受欢迎。

扩展正则表达式:

(^(?:(?:(?:31(?:(?:([-.\/])(?:0?[13578]|1[02])\1)|(?:([-.\/ ])(?:Jan|JAN|Mar|MAR|May|MAY|Jul|JUL|Aug|AUG|Oct|OCT|Dec|DEC)\2)))|(?:(?:29|30)(?:(?:([-.\/])(?:0?[13-9]|1[0-2])\3)|(?:([-.\/ ])(?:Jan|JAN|Mar|MAR|Apr|APR|May|MAY|Jun|JUN|Jul|JUL|Aug|AUG|Sep|SEP|Oct|OCT|Nov|NOV|Dec|DEC)\4))))(?:(?:1[6-9]|[2-9]\d)?\d{2}))$|^(?:29(?:(?:([-.\/])(?:0?2)\5)|(?:([-.\/ ])(?:Feb|FEB)\6))(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))$|^(?:(?:0?[1-9]|1\d|2[0-8])(?:(?:([-.\/])(?:(?:0?[1-9]|(?:1[0-2])))\7)|(?:([-.\/ ])(?:Jan|JAN|Feb|FEB|Mar|MAR|May|MAY|Jul|JUL|Aug|AUG|Oct|OCT|Dec|DEC)\8))(?:(?:1[6-9]|[2-9]\d)?\d{2}))$)

正则表达式演示中包含的测试用例

特征(保留):

  • 闰年检查(2 月 29 日验证)包括逻辑:(可被 4 整除但不能被 100 整除)或(可被 400 整除)
  • 支持年份 1600 ~ 9999
  • 支持dd/mm/YYYY, dd-mm-YYYY, dd.mm.YYYY(但不支持dd mm YYYY
  • 支持dd mmm YYYY, dd-mmm-YYYY, dd/mmm/YYYY, dd.mmm.YYYYdd mmm YYYY新增。mmm 可以是大写,例如 DEC 或标题格式,例如 Dec)

一些额外的小修饰如下:

  1. 包括 Ofir Luzon 在 2019 年 2 月 14 日的修复,以删除正则表达式中的逗号,该逗号允许日期为 29-0,-11 [错误复制到 Alok Chaudhary 的正则表达式]

  2. 替换(\/|-|\.)([-.\/])以尽量减少反斜杠的使用。\/仍然用于支持某些正则表达式风格,例如 PCRE(PHP),尽管其他一些正则表达式风格,例如 Python 可以简单地/在字符类 []中使用

  3. 在整个正则表达式周围添加了一对括号 (),以使其成为整个匹配字符串的捕获组。这对于使用 findAll 类型的函数来获取匹配项列表的人很有用(例如re.findall在 Python 中)。这使我们能够使用以下代码捕获多行字符串中的所有匹配字符串:

re.findall示例代码:

match_list = re.findall(regex, source_string)
for item in match_list:
    print(item[0])

扩展正则表达式图像: 在此处输入图像描述

应该归功于 Ofir Luzon 和 Alok Chaudhary,他们为我们所有人创造了如此出色的正则表达式!

于 2021-02-01T20:10:10.017 回答
1
year  = ((20[012]\d|19\d\d)|(1\d|2[0123])) 
month = ((0[0-9])|(1[012]))
day   = ((0[1-9])|([12][0-9])|(3[01]))

year-month-day = (((20[012]\d|19\d\d)|(1\d|2[0123]))-((0[0-9])|(1[012]))-((0[1-9])|([12][0-9])|(3[01])))
day-month-year = (((0[1-9])|([12][0-9])|(3[01]))-((0[0-9])|(1[012]))-((20[012]\d|19\d\d)|(1\d|2[0123])))
year/month/day = (((20[012]\d|19\d\d)|(1\d|2[0123]))\/((0[0-9])|(1[012]))\/((0[1-9])|([12][0-9])|(3[01])))
month/day/year = (((0[0-9])|(1[012]))\/((0[1-9])|([12][0-9])|(3[01]))\/((20[012]\d|19\d\d)|(1\d|2[0123])))
day/month/year = (((0[1-9])|([12][0-9])|(3[01]))\/((0[0-9])|(1[012]))\/((20[012]\d|19\d\d)|(1\d|2[0123])))
day.month.year = (((0[1-9])|([12][0-9])|(3[01]))\.((0[0-9])|(1[012]))\.((20[012]\d|19\d\d)|(1\d|2[0123])))
year.month.day = (((20[012]\d|19\d\d)|(1\d|2[0123]))\.((0[0-9])|(1[012]))\.((0[1-9])|([12][0-9])|(3[01])))


all = (((20[012]\d|19\d\d)|(1\d|2[0123]))-((0[0-9])|(1[012]))-((0[1-9])|([12][0-9])|(3[01])))|(((0[1-9])|([12][0-9])|(3[01]))-((0[0-9])|(1[012]))-((20[012]\d|19\d\d)|(1\d|2[0123])))|(((20[012]\d|19\d\d)|(1\d|2[0123]))\/((0[0-9])|(1[012]))\/((0[1-9])|([12][0-9])|(3[01])))|(((0[0-9])|(1[012]))\/((0[1-9])|([12][0-9])|(3[01]))\/((20[012]\d|19\d\d)|(1\d|2[0123])))|(((0[1-9])|([12][0-9])|(3[01]))\/((0[0-9])|(1[012]))\/((20[012]\d|19\d\d)|(1\d|2[0123])))|(((0[1-9])|([12][0-9])|(3[01]))\.((0[0-9])|(1[012]))\.((20[012]\d|19\d\d)|(1\d|2[0123])))|(((20[012]\d|19\d\d)|(1\d|2[0123]))\.((0[0-9])|(1[012]))\.((0[1-9])|([12][0-9])|(3[01])))

它的工作

yyyy-mm-dd
dd-mm-yyyy
yyyy/mm/dd
mm/dd/yyyy
dd/mm/yyyy
dd.mm.yyyy
yyyy.mm.dd

yy-mm-dd
dd-mm-yy
yyyy/mm/dd
mm/dd/yy
dd/mm/yy
dd.mm.yy
yy.mm.dd

但不适用于 day =d或 month = m,例如 dmyyyy

所有示例 -在此处输入链接描述

于 2022-02-05T11:30:06.077 回答
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])))

将使用to验证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/

于 2016-06-28T13:58:58.097 回答
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}$

它验证正确的日期和飞蛾。

请记住,您可以在以下位置检查您的正则表达式

正则表达式101

我推荐:)

玩得开心!

于 2016-10-21T12:18:10.840 回答
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 (mm-dd-yyyy) 或 12-3-2016 (mm-d-yyyy) 或 1-3-2016 (md-yyyy) 或 1-30-2016 (m-dd-yyyy)

于 2016-11-02T18:17:38.550 回答
0

我知道这是对这个问题的切题答案,但如果问题的目的是“我如何验证日期?”,那么为什么不尝试让编程语言完成所有艰苦的工作(如果你使用的语言是能够)?

例如在php中

$this_date_object = date_create($this_date);

if ($this_date_object == false )
    {

        // process the error

    }
于 2019-02-27T12:20:26.953 回答
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])">/
于 2020-07-26T13:48:12.870 回答
0

如果您正在寻找特定格式,这适用于“dd/MM/yyyy”和“dd/MMM/yyyy”日期格式,仅基于 Alok 答案。

function isValidDateFormatDDMMYYYY(inputDate) {
    var date_regex = /^(?:(?:31(\/)(?:0?[13578]|1[02]|(?:Jan|Mar|May|Jul|Aug|Oct|Dec)))\1|(?:(?:29|30)(\/)(?:0?[1,3-9]|1[0-2]|(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/)(?:0?2|(?:Feb))\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/)(?:(?:0?[1-9]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep))|(?:1[0-2]|(?:Oct|Nov|Dec)))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/;
    return date_regex.test(inputDate);
}

很少有通过此代码工作的示例-

  • isValidDateFormatDDMMYYYY("15/01/1999") // 返回 True
  • isValidDateFormatDDMMYYYY("15/Jan/1999") // 返回 True
  • isValidDateFormatDDMMYYYY("15/1/1999") // 返回 True
  • isValidDateFormatDDMMYYYY("1/15/1999") // 返回 False

谢谢

于 2020-09-03T08:12:46.323 回答
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
}

于 2021-09-14T14:31:57.480 回答