Я думаю, вам следует рассмотреть возможность использования некоторых функций даты / времени для этой цели.
Вы используете классы персонажей неправильно. [1-31]
, [1-12]
и [1900-2009]
не будут проверять диапазоны, которые у вас есть. Это не то, как классы символов работают, и, следовательно, это не то, как вы проверяете числовые диапазоны с помощью регулярных выражений.
Класс символов [a-r]
соответствует любому символу от a
до r
. [a-rx]
соответствует любому символу от a
до r
и символу x
. Аналогичным образом, [1-39]
соответствует любому символу от 1
до 3
и символу 9
- следовательно, он соответствует одному из 1,2,3 и 9 - а не любому числу от 1 до 39, как вы предполагали.
[1-31]{2}
соответствует двум последовательным числам (последнее 1 является избыточным), оба в диапазоне от 1 до 3 - 33
является действительным соответствием.
Чтобы соответствовать числу от 1 до 31, правильное регулярное выражение - 0?[1-9]|[1-2][0-9]|3[0-1]
. ('0?' Заботится о заполнении нулями, как в 01-09-2009
Для месяцев: 0?[1-9]|1[0-2]
Для года: 19[0-9]{2}|200[0-9]
И -
не является метасимволом вне классов символов - вам не нужно избегать его.
Правильное регулярное выражение будет:
/^(0?[1-9]|[1-2][0-9]|3[0-1])-(0?[1-9]|1[0-2])-(19[0-9]{2}|200[0-9])$/
Если вы не заинтересованы в захвате значений, вы можете написать это как:
/^(?:0?[1-9]|[1-2][0-9]|3[0-1])-(?:0?[1-9]|1[0-2])-(?:19[0-9]{2}|200[0-9])$/