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

# 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))\$
``````

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
• 2
• 2
1 Solution

IT 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";
}
``````

There are plenty of lubraries to do this type of validation: Date::Parse
0

Author 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

IT 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
``````

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

Author 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.