Регулярное сопоставление даты не работает - PullRequest
1 голос
/ 21 мая 2011

У меня проблема с моим регулярным выражением. Вот оно.

/0[1-9]|1[0-2]|^[1-9]{1}$\/^[1-9]{1}$|0[1-9]|[1-2]\d|3[0-1]\/19\d{2}|20\d{2}/

Не должно совпадать с этой датой,

1/32/2006

но по какой-то причине он совпадает, вы можете сказать мне, что я делаю неправильно?

Ответы [ 5 ]

2 голосов
/ 21 мая 2011

Это интересно:

^[1-9]{1}$

Похоже, вы используете это, чтобы соответствовать цифре, которой не предшествует или не следует другая цифра. Это не сработает. ^ и $ привязывают совпадение к началу и концу строки, а {1} вообще ничего не делает.

Если вы хотите разрешить однозначное число с необязательным начальным нулем, используйте это:

0?[1-9]

Тогда полное регулярное выражение будет:

(?:1[02]|0?[1-9])\/(?:3[01]|[12]\d|0?[1-9])\/(?:19\d{2}|20\d{2})

Я также добавил скобки для группировки, как предложил @Seth.

2 голосов
/ 21 мая 2011

Казалось бы, у вас есть несколько проблем.

Регулярное выражение соответствует «06» (из 2006) в самой первой из перечисленных вами альтернатив «0 ​​[1-9]»

Вы, вероятно, имели в виду

/^(0[1-9]|1[0-2]|^[1-9]{1})\/([1-9]{1}|0[1-9]|[1-2]\d|3[0-1])\/(19\d{2}|20\d{2})$/

или что-то в этом роде (я не проверял это регулярное выражение, и у него, вероятно, остались другие проблемы), но вам действительно нужно посмотреть на Регулярное выражение, чтобы соответствовать действительному дню в дате , чтобы увидеть лучшее регулярное выражение и слова мудрым о том, чтобы делать подобные вещи в регулярном выражении.

1 голос
/ 21 мая 2011

Даже при всем расстоянии и лучшем разделителе

m{
    ^
    (?: 0[1-9] | 1[0-2]? | [2-9] )
    /
    (?: 0[1-9] | 1[0-9]? | 2[0-9]? | 3[0-1]? | [4-9] )
    /
    (?: (?:19|20)[0-9]{2} )
    \z
}x

не так хорошо читается как

m{ ^ ([0-9]{1,2}) / ([0-9]{1,2}) / ([0-9]{4}) \z }x
    && $1 >=    1 && $1 <=   12
    && $2 >=    1 && $2 <=   31
    && $3 >= 1900 && $3 <= 2099

Я применил некоторые исправления:

  1. \d не эквивалентно [0-9].
  2. $ допускает перевод строки.
  3. Я избежал ненужных захватов (поскольку у оригинала их не было).
1 голос
/ 21 мая 2011

Вам нужно сгруппировать разделы и избавиться от ^ и $.

/(0[1-9]|1[0-2]|[1-9]{1})\/([1-9]{1}|0[1-9]|[1-2]\d|3[0-1])\/((19|20)\d{2})/
0 голосов
/ 21 мая 2011

Хороший обзор регулярных выражений, соответствующих датам , здесь . В частности, он перечисляет это регулярное выражение для совпадающих дат ММ / ДД / ГГГГ:

^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$
...