• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 136
  • Last Modified:

Date input validation (Regular Expressions) [2]

I had this question after viewing Date input validation (Regular Expressions).

Hi guys,
I have expression below :
^((0?[1-9]|[12][0-9]|3[01])[\/](0?[13578]|1[02])[\/](18|19|20)[0-9]{2})|((0?[1-9]|[12][0-9]|30)[\/](0?[469]|11)[\/](18|19|20)[0-9]{2})|((0[1-9]|1[0-9]|2[0-8])[\/](0?[2])[\/](18|19|20)[0-9]{2})|(29[\/](0?[2])[\/](((18|19|20)(04|08|[2468][048]|[13579][26]))|2000))$

Open in new window


1. Day validation of 28, 29, 30, 31
2. years in range 1800-2099
3. seperator /
4. format dd/mm/yyyy

I tied to fix days and months in range   1, 2, 3, 4, . . .  or  01, 02, 03, 04, . . .

validation is successful on any month and any year (include leap year)
Except these entries on February: 1/2/2016, 2/02/2016, 3/2/2017 . . .  Failure on one digit day.

 Thank you!
0
Darius
Asked:
Darius
  • 2
  • 2
1 Solution
 
Kim RyanIT ConsultantCommented:
Looks like you just left out the ? after 0 day in February, line 6 in the Perl example below
my $a = '2/02/2016';

if ($a =~ /^
    ((0?[1-9]|[12][0-9]|3[01])[\/](0?[13578]|1[02])[\/](18|19|20)[0-9]{2})|  # jan, march, may etc
    ((0?[1-9]|[12][0-9]|30)[\/](0?[469]|11)[\/](18|19|20)[0-9]{2})|          # apr, jun etc
    ((0?[1-9]|1[0-9]|2[0-8])[\/](0?[2])[\/](18|19|20)[0-9]{2})|              # feb
    (29[\/](0?[2])[\/](((18|19|20)(04|08|[2468][048]|[13579][26]))|2000))$   # leap day
    /x )
{
    print "matched day: $1\n";
}

Open in new window


There are plenty of lubraries to do this type of validation: Date::Parse
0
 
DariusAuthor Commented:
Hi Kim,

  I have the same changes done, but it brake February validation

For example:  29/2/2017,  29/02/2017,  29/2/2018,  29/02/2018, 29/2/2019,  29/02/2019, . . .

Leap year 2016, 2020, . . .  correct!

Thanks
0
 
Kim RyanIT ConsultantCommented:
The anchors point ^ and $ didn't seem to be working, they need to be inside brackets.

    ((^0?[1-9]|[12][0-9]|3[01])[\/](0?[13578]|1[02])[\/](18|19|20)[0-9]{2})$|  # jan, march, may etc
    ((^0?[1-9]|[12][0-9]|30)[\/](0?[469]|11)[\/](18|19|20)[0-9]{2})$|          # apr, jun etc
    ((^0?[1-9]|1[0-9]|2[0-8])[\/](0?[2])[\/](18|19|20)[0-9]{2})$|              # feb
    (^29[\/](0?[2])[\/]
     ((
       (18|19|20)(04|08|
        [2468][048]|[13579][26]))|
        2000
    $))   # leap day

Open in new window



This would be a lot simpler if you just extracted dd, mm, yyyy and then used if then logic to validate all cases (such as is year divisible by 4 but not 400 etc).
1
 
DariusAuthor Commented:
Kim,

This is just a challenge for myself. Thanks for help!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now