2011-01-26 1 views
1

Я пытаюсь написать некоторые регулярные выражения для проверки ввода даты MM/DD/YYYY. Каждая часть даты представляет собой отдельный вход текстовое поле, разделенные "/", как:JavaScript регулярное выражение для соответствия формату mm/dd/yyyy - ограничение только числового ввода

//

За день 16 января 1985 года

У меня есть это сейчас, когда он позволяет только числовые записи, что было легко с помощью replace() и простого регулярного выражения. BTW, regex's не мои сильные стороны, я не делаю много из них, может быть, раз или два раза в пару лет.

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

//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? 
); 

ответ

0

регулярное выражение для формата даты, которые вы хотите должны что-то вроде этого

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

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

+1

С, что я не мог ввести дату 99/99/9999? Я ищу дату действительной даты. См. Мое регулярное выражение psuedo, которое закомментировано для каждого текстового поля. –

4
(?: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} 
    
+0

Нет /, есть 3 отдельных текстовых поля, разделенных символом/ //

+0

Просто вопрос разбивки, затем отредактированный пост :) –

1

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

#^(?:(?:(?:(?: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) 
) 
$ 

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

Этот матч один неверная дата: 02/29/1900, но верно для любых других дат между 01.01.1900 и 12/31/2099

Смежные вопросы