regexp формат даты
нужно проверить соответсвие строки формату даты.
формат даты - одна или две буквы d(день), одна или две m(месяц), две или четыре буквы y(год). порядок не важен. день, месяц и год разделены одинаковыми разделителями. пример, 'dd-mm-yyyy', 'd/m/yy', 'yy.mm.dd'. не должно подходить 'd-d-yy', 'yyyy-mm-m' на данный момент есть такой код 'dd-mm-yyyy'.match(/^(d{1,2}|m{1,2}|y{4}|y{2})([^a-zA-Z0-9]+)(d{1,2}|m{1,2}|y{4}|y{2})\2(d{1,2}|m{1,2}|y{4}|y{2})$/) самый главный вопрос, можно ли проверить, чтобы нельзя было повторить день, месяц или год (например так 'd-d-yy') и можно ли заменить y{4}|y{2} одним выражением (y{2,4} не подходит) |
Цитата:
01/02/03 Что это за даты, согласно вашего алгоритма? |
Цитата:
|
Мне кажется регой дату не проверить. Придется разбирать по частям. И проверять по числам. Например: 29.02.2012
1. бьем по точкам (в данном случае) 2. проверяем год >= 1900 <= 2200 (для примера) 3. месяц >= 1 <=12 (в зависимости от года 29 фев.) 4. день в зависимости от месяца Или попробовать мухлевать с объектом Date, в частности с Date.parse. Или (не знаю, насколько правильно это рассуждение), действовать (через ж) так: var w = "12.12.2012".split("."); var x = new Date(); x.setFullYear(w[2]); x.setMonth(w[1]); x.setDate(w[0]); //затем получать дату if (x.getDate() + ".(Ваш разделитель)" + x.getMonth() + "." + x.FullYear() == w.join(".")); но получается какой-то велосипед.) Писал прям форум, ес че звиняйте ^_^ |
Цитата:
вы видимо не правильно поняли вопрос. мне нужно проверить соответствие строки именно формату даты, а не самой дате. Цитата:
например, в плагине календаря есть настройка, принимающая этот формат, т.е. сначала задаётся формат даты, а затем даты на сайте выводятся в соответствии с этим форматом. в настройках задаём формат 'yyyy-mm-dd', на сайте даты будут выводится в соответствии с этим форматом, т.е. '2012-01-16'. |
Цитата:
|
nerv_,
перечитывать первый пост до просветления. особое внимание уделить коду. Цитата:
ну, кроме перечислить все варианты размещения блоков относительно друг друга(6 штук) Цитата:
yy(y{2})? |
Цитата:
Цитата:
Цитата:
Цитата:
Тогда уж говорите не о проверке формата, а о валидности даты. Ибо, если она не валидна (а просто набор цифр), какая разница какой у них "формат"? |
Цитата:
Мы же тут не на свободную тему общаемся, а все-таки вполне конкретную задачу решаем? eca, Вот так, в лоб можно решить вашу задачу function is_date_format(str) { var a = str.match(/^(y{4}|[dmy]{2})([^a-zA-Z0-9]+)(y{4}|[dmy]{2})([^a-zA-Z0-9]+)(y{4}|[dmy]{2})$/); if(a.length != 6) { return false; } var b = {}; b[a[1].substring(0,1)] = 1; b[a[3].substring(0,1)] = 1; b[a[5].substring(0,1)] = 1; if(b.d && b.m && b.y) { return true; } else { return false; } } alert(is_date_format('dd-mm-yyyy')); alert(is_date_format('dd-mm-dd')); |
Цитата:
1. тс сам не знает чего хочет 2. знает, но не понимает, как это реализовать 3. неверно формулирует задачу 4. выбирает далеко не самый лучший вариант ее решения 5. и т.д. В данном случае скорее всего пункты 2 и 3. Цитата:
|
Цитата:
/^(y{4}|[dmy]{2})([^a-zA-Z0-9]+)(y{4}|[dmy]{2})([^a-zA-Z0-9]+)(y{4}|[dmy]{2})$/ так как в вашем случае 'dm-mm-yyyy' возвращает true, а 'd-m-yyyy' выдает ошибку. я уже сделал практически также, как у вас function is_date_format(format) { var formatRegExp = /^(d{1,2}|m{1,2}|y{4}|y{2})([^a-zA-Z0-9]+)(d{1,2}|m{1,2}|y{4}|y{2})\2(d{1,2}|m{1,2}|y{4}|y{2})$/; if ( format.match(formatRegExp) === null ) { throw new Error('date format regexp error'); } var delimiter = formatRegExp.exec(format)[2]; var delimiterFirstIndex = format.indexOf(delimiter); var delimiterLastIndex = format.lastIndexOf(delimiter); var firstChar = format.charAt(delimiterFirstIndex-1); var secondChar = format.charAt(delimiterFirstIndex + delimiter.length); var thirdChar = format.charAt(delimiterLastIndex + delimiter.length); if ( firstChar === secondChar || secondChar === thirdChar || firstChar === thirdChar ) { throw new Error('date fomat char error'); } return true; } console.log(is_date_format('d-m-d')); но у вас более лаконично получилось, спасибо за ответ!! |
Часовой пояс GMT +3, время: 19:34. |