Yes you most likely want character classes, but use them in some splits. This screams split, you are taking a string and splitting it into different pieces.
Why aren't you using a module for this? Data::Calc and DateTimeX::Easy are both excellent choices. Using one of them you're guaranteed that either:
The module can parse the string - you will get either a date object or and array of the date tokens.