Does anyone know of a reg expression for uk date format

后端 未结 7 923
青春惊慌失措
青春惊慌失措 2021-01-18 21:39

Hi does any one know a reg ex for a uk date format e.g. dd/mm/yyyy.

The dd or mm can be 1 character e.g. 1/1/2010 but the year must always be 4 characters.

T

相关标签:
7条回答
  • 2021-01-18 22:09
    \b(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d
    

    This wont validate the date, but you can check for format

    0 讨论(0)
  • ^\d{1,2}/\d{1,2}/\d{4}$
    

    will match 1/1/2000, 07/05/1999, but also 99/77/8765.

    So if you want to do some rudimentary plausibility checking, you need

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

    This will still match 31/02/9999, so if you want to catch those, it's getting hairier:

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

    But this still won't catch leap years. So, modifying a beast of a regex from regexlib.com:

    ^(?:(?:(?:(?:31\/(?:0?[13578]|1[02]))|(?:(?:29|30)\/(?:0?[13-9]|1[0-2])))\/(?:1[6-9]|[2-9]\d)\d{2})|(?:29\/0?2\/(?:(?:(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]))\/(?:(?:1[6-9]|[2-9]\d)\d{2}))$
    

    will match

    1/1/2001
    31/5/2010
    29/02/2000
    29/2/2400
    23/5/1671
    01/1/9000
    

    and fail

    31/2/2000
    31/6/1800
    12/12/90
    29/2/2100
    33/3/3333
    

    All in all, regular expressions may be able to match dates; validating them is not their forte, but if they are all you can use, it's certainly possible. But looks horrifying :)

    0 讨论(0)
  • 2021-01-18 22:17
    \b(0?[1-9]|[12][0-9]|3[01])[/](0?[1-9]|1[012])[/](19|20)?[0-9]{2}\b
    

    Match :

    • 1/1/2010
    • 01/01/2010

    But also invalid dates such as February 31st

    0 讨论(0)
  • 2021-01-18 22:22

    I ran into the similar requirements. Here is the complete regular expression along with Leap Year validation. Format: dd/MM/yyyy

    (3[01]|[12]\d|0[1-9])/(0[13578]|10|12)/((?!0000)\d{4})|(30|[12]\d|0[1-9])/(0[469]|11)/((?!0000)\d{4})|(2[0-8]|[01]\d|0[1-9])/(02)/((?!0000)\d{4})| 29/(02)/(1600|2000|2400|2800|00)|29/(02)/(\d\d)(0[48]|[2468][048]|[13579][26])

    It can be easily modified to US format or other EU formats.

    edited:

    (3[01]|[12]\d|0[1-9])/(0[13578]|10|12)/((?!0000)\d{4})|(30|[12]\d|0[1-9])/(0[469]|11)/((?!0000)\d{4})|(2[0-8]|[01]\d|0[1-9])/(02)/((?!0000)\d{4})|29/(02)/(1600|2000|2400|2800|00)|29/(02)/(\d\d)(0[48]|[2468][048]|[13579][26])

    0 讨论(0)
  • 2021-01-18 22:27

    Regex is not the right tool for this job.

    It is very difficult (but possible) to come up with the regex to match a valid date. Things like ensuring Feb has 29 days on leap year and stuff is not easily doable in regex.

    Instead check if your language library provides any function for validating dates.

    PHP has one such function called checkdate :

    bool checkdate  ( int $month  , int $day  , int $year)
    
    0 讨论(0)
  • 2021-01-18 22:28

    ^\d{1,2}/\d{1,2}/\d{4}$

    In braces there is min and max char count. \d means digit, ^ start, and $ end of string.

    0 讨论(0)
提交回复
热议问题