Regex to validate date format dd/mm/yyyy

后端 未结 21 2301
挽巷
挽巷 2020-11-21 06:32

I need to validate a date string for the format dd/mm/yyyy with a regular expresssion.

This regex validates dd/mm/yyyy, but not the invalid

相关标签:
21条回答
  • 2020-11-21 07:15

    The following expression is nice and easy to manipulate:

    ((((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])))
    

    It validates according to the MM/dd/YYYY format and allows for leap year support from 1960 to 2016. If you need the leap year support extended you need only manipulate this part of the expression:

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

    Hope this helped you a lot

    0 讨论(0)
  • 2020-11-21 07:16

    I suspect that the following is as accurate as can be expected without knowing when the user's locale switched over from the Julian to the Gregorian calendars.

    It accepts either '-', '/', or nothing as separators between year, month, and day, no matter the order.

    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)$
    

    Other than order, these all are accurate to the Julian Calendar (leap year every four years) until 1700, when the Gregorian Calendar diverges from the Julian. It has two issues:

    1. It accepts the year 0000, which doesn't exist in many, but not all, standards. Note that ISO 8601 does accept year 0000 (equivalent to 1 BCE).
    2. It doesn't skip the 10-13 days which were lost when the Gregorian Calendar came into use. This varies by locality though. For example, the Roman Catholic Church skipped 10 days, October 5th through October 14th, 1582, but Greece (the last to switch) skipped February 16th through the 28th of 1923, 13 days, having to take into account the leap years of 1700, 1800, and 1900.

    This has been tested against Java's calendar implementation from the year 0001 until the year 9999 with the only discrepancy being the abovementioned 10 days in 1582.

    0 讨论(0)
  • 2020-11-21 07:20

    For use only for the day:

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

    For use only for the month:

     <input placeholder="month" maxlength="2" minlength="1" 
      formControlName="month" name="month" formControlName="month" name="month" pattern="(0[1- 
      9]|1[0-2])">/
    
    0 讨论(0)
  • 2020-11-21 07:21

    Here I wrote one for dd/mm/yyyy where separator can be one of -.,/ year range 0000-9999.

    It deals with leap years and is designed for regex flavors, that support lookaheads, capturing groups and backreferences. NOT valid for such as d/m/yyyy. If needed add further separators to [-.,/]

    ^(?=\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}$
    

    Test at regex101; as a Java string:

    "^(?=\\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}$"
    

    explained:

    (?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
    

    Also see SO Regex FAQ; Please let me know, if it fails.

    0 讨论(0)
  • 2020-11-21 07:24

    For date MM/DD/YYYY you can use

    ^((((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}$
    

    It verify proper days and moths.

    Remeber that you can check your regular expression at

    regex101

    which i recommend :)

    Have fun!

    0 讨论(0)
  • 2020-11-21 07:24
    ^(((([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])))
    

    this regex will validate dates in format:

    12-30-2016 (mm-dd-yyyy) or 12-3-2016 (mm-d-yyyy) or 1-3-2016 (m-d-yyyy) or 1-30-2016 (m-dd-yyyy)

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