Регулярное выражение JavaScript для соответствия формату мм / дд / гггг - ограничено только числовым вводом - PullRequest
1 голос
/ 26 января 2011

Я пытаюсь написать несколько регулярных выражений для проверки ввода даты в ММ / ДД / ГГГГ. Каждая часть даты является отдельным входным текстовым полем, разделенным символом "/":

01 / 16 / 1985

На дату 16 января 1985 года.

Теперь он у меня там, где он допускает только числовые записи, что было легко с помощью replace () и простого регулярного выражения. Кстати, регулярные выражения - не моя сильная сторона, я их мало делаю, может быть, один или два раза в пару лет.

Ниже приведен код, который я использую, а также некоторые псевдо-регулярные выражения под моей заменой (). Мне трудно связать регулярное выражение числовой записи с регулярным выражением форматирования даты, которого я пытаюсь достичь (закомментировано в replace ())

//MM  
$(this).keyup(function() {  
    //allow only numbers  
    this.value = this.value.replace(/[^0-9]/g, '');  

    //(0[1-9]|1[012])  
    //matching 01 (Jan) to 09 (Sep) to 10 (Oct) to 12 (Dec)  
});

//DD  
$(this).keyup(function() {
    //allow only numbers
    this.value = this.value.replace(/[^0-9]/g, '');

    //(0[1-9]|[12][0-9]|3[01])
    //matching 01-09, 10-19, 20-29, 30-31
    //(not worried about picking 31 in February)
});

//YYYY  
$(this).keyup(function() {
    //allow only numbers
    this.value = this.value.replace(/[^0-9]/g, '');

    //(\d{4})
    //really simple 4 digit, but don't really want 1245 as a valid year

    //a range from 1900-current year would be great
//( 1900-newDate().getFullYear() )
    //something like this possible?
);

Ответы [ 3 ]

4 голосов
/ 27 января 2011
(?:0[1-9]|1[0-2])/(?:0[1-9]|[12][0-9]|3[01])/(?:19|20)[0-9]{2}
  • Совпадения с 01 по 12/01 по 31 / с 1900 по 2099
  • Ограничение: 31 февраля (и тому подобное) совпадений
  • (?:text) предотвращает обратную ссылку, удалите ?:, если вам это нужно
  • В зависимости от того, как вы его используете, вам может понадобиться экранировать / -> \/

Три разных поля - это просто вопрос разделения, / является разделителем.

  • День (с 01 по 31)

    0[1-9]|[12][0-9]|3[01]
    
  • Месяц (от 01 до 12)

    0[1-9]|1[0-2]
    
  • Год (1900-2099)

    (?:19|20)[0-9]{2}
    
1 голос
/ 27 января 2011

Лучше разбейте на / и протестируйте все отдельные части. Но если вы действительно хотите использовать регулярные выражения, вы можете попробовать это:

#^(?:(?:(?:(?:0?[13578])|(1[02]))/31/(19|20)?\d\d)|(?:(?:(?:0?[13-9])|(?:1[0-2]))/(?:29|30)/(?:19|20)?\d\d)|(?:0?2/29/(?:19|20)(?:(?:[02468][048])|(?:[13579][26])))|(?:(?:(?:0?[1-9])|(?:1[0-2]))/(?:(?:0?[1-9])|(?:1\d)|(?:2[0-8]))/(?:19|20)?\d\d))$#

Пояснение:

^            # start of line
 (?:         # group without capture
             # that match 31st of month 1,3,5,7,8,10,12
   (?:       # group without capture
     (?:     # group without capture
       (?:   # group without capture
         0?  # number 0 optionnal
         [13578] # one digit either 1,3,5,7 or 8
       )     # end group
       |     # alternative
       (1[02]) # 1 followed by 0,1 or 2
     )       # end group
     /       # dash
     31      # number 31
     /       # dash
     (19|20)? #numbers 19 or 20 optionnal
     \d\d    # 2 digits from 00 to 99 
   )         # end group
|
   (?:(?:(?:0?[13-9])|(?:1[0-2]))/(?:29|30)/(?:19|20)?\d\d)
|
   (?:0?2/29/(?:19|20)(?:(?:[02468][048])|(?:[13579][26])))
|
   (?:(?:(?:0?[1-9])|(?:1[0-2]))/(?:(?:0?[1-9])|(?:1\d)|(?:2[0-8]))/(?:19|20)?\d\d)
 )
$

Я объяснил первую часть, оставив остальное как упражнение.

Это соответствует одной недопустимой дате: 29.02.1900, но верно для любых других дат в период с 01.01.1900 по 12/12/2099

0 голосов
/ 26 января 2011

регулярное выражение для требуемого формата даты должно быть примерно таким:

[0-9]{2}/[0-9]{2}/[0-9]{4}

это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...