javaregexdateparsing

Regex date format validation on Java


I'm just wondering if there is a way (maybe with regex) to validate that an input on a Java desktop app is exactly a string formatted as: "YYYY-MM-DD".


Solution

  • Use the following regular expression:

    ^\d{4}-\d{2}-\d{2}$
    

    as in

    if (str.matches("\\d{4}-\\d{2}-\\d{2}")) {
        ...
    }
    

    With the matches method, the anchors ^ and $ (beginning and end of string, respectively) are present implicitly.

    The pattern above checks conformance with the general “shape” of a date, but it will accept more invalid than valid dates. You may be surprised to learn that checking for valid dates — including leap years! — is possible using a regular expression, but not advisable. Borrowing from an answer elsewhere by Kuldeep, we can all find amusement and admiration for persistence in

    ((18|19|20)[0-9]{2}[\-.](0[13578]|1[02])[\-.](0[1-9]|[12][0-9]|3[01]))|(18|19|20)[0-9]{2}[\-.](0[469]|11)[\-.](0[1-9]|[12][0-9]|30)|(18|19|20)[0-9]{2}[\-.](02)[\-.](0[1-9]|1[0-9]|2[0-8])|(((18|19|20)(04|08|[2468][048]|[13579][26]))|2000)[\-.](02)[\-.]29
    

    In a production context, your colleagues will appreciate a more straightforward implementation. Remember, the first rule of optimization is Don’t!