2012-05-28 5 views
1

Я пытаюсь использовать регулярное выражение javascript для проверки даты рождения текстового поля. Вот мой кодрегулярное выражение шаблон ошибка

var patt=/[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}/; 
alert(patt.test("1985/08/03")); 

и сказал ошибка: SyntaxEror: Неожиданный маркер {

Я не понимаю, почему эта схема прекрасно работает в контроллере asp.net RegularExpressionValidator. Большое спасибо

+0

Надеюсь, вы ничего не делаете на международном уровне или, по крайней мере, не уточняете желаемый формат, потому что иначе может быть дата '2012-11-13' или '20 .10.2012 'или некоторые из них. –

+0

Я использовал datepicker и формат фиксирован, но я предполагаю, что некоторые люди будут вводить что-то, поэтому я использую RE для проверки – pita

ответ

4

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

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

Для краткости можно использовать \d вместо [0-9] тоже:

var patt = /^\d{1,2}\/\d{1,2}\/\d{4}$/; 

NB: Ваш пример не работает - вы положили первый год, но RE ожидает, что это будет последним.

+0

. Я просто хочу использовать образец для проверки RE, но большое спасибо – pita

2

Вот пример кода, который действительно проверки даты в JavaScript:

function isValidDate(dateStr) { 
    s = dateStr.split('/'); 
    d = new Date(+s[2], s[1]-1, +s[0]); 
    if (Object.prototype.toString.call(d) === "[object Date]") { 
     if (!isNaN(d.getTime()) && d.getDate() == s[0] && 
      d.getMonth() == (s[1] - 1)) { 
      return true; 
     } 
    } 
    return false; 
} 

См Detecting an "invalid date" Date instance in JavaScript

1

Проблема в том, что вы не избегаете/разделителей в шаблоне. Попробуйте

/[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}/; 
0

регулярное выражение (после того, как вы исправить не экранирован «/») будет проверять только нужное количество цифр.
Он не будет проверять, находится ли месяц между 1 и 12, дни между 1 и 31, или 30, или 28 или 29 в зависимости от месяца и високосного года.

Если этого достаточно для вас, ближайших вы можете получить с регулярным выражением (предполагаются, что дд/мм/гггг):

/(3[01]|[12][0-9]|0?[1-9])\/(1[012]|0?[1-9])\/([12][0-9]{3})/

дней будут находиться в диапазоне 1-31
месяца будут быть в диапазоне 1-12
Я взял на себя смелость ограничить годы от 1000 до 2999, но вы можете поймать формат, если вы хотите ограничить с 1970 по 2059 год использование (19[789][0-9]|20[0-5][0-9]) в год.
И вы получите день на $ 1, месяц на $ 2 и год на $ 3 (я думаю)

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