2015-07-13 1 views
1

В настоящее время я пытаюсь создать Regex, который соответствует/проверяет строку XSDDateTime. Я нашел несколько в Интернете, но никто из них не делает приличную проверку на 31 февраля и т. Д., И я бы хотел, чтобы он также проверял високосные годы.RegEx для XSDDateTime

То, что я получил до сих пор

[1-9][0-9]{3}\-(0[1-9]|1[1-2])\-(0[1-9]|1[1-9]|2[])T(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(Z|\+|\-(0[1-9]|1[1-2]):(0[1-9]|1[1-2])) 

, но это не будет выдавать ошибку за 31 февраля ...

Есть ли правильное RegEx для этого я просто еще не нашли ? Потому что строить один с нуля очень грязно. Любая помощь будет оценена.

+0

ли это быть регулярным выражением? На каком языке вы это делаете? – tomsv

+0

Я делаю это в PHP прямо сейчас, но это должно быть скорее независимым от языка. Я думаю, что – Xenonite

+1

Вы не должны делать это с помощью регулярного выражения, в то время как с некоторой борьбой вы можете добавить спецификации февральского месяца, а что нет, но вы можете ' я действительно занимаюсь високосными годами, поскольку регулярное выражение и математика не идут хорошо вместе, не говоря уже о том, что вам также придется включать «2000 год» (это не високосный год) и так далее. –

ответ

1

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

Для PHP, вы можете неповрежденный выглядящий DateTimes с this regex:

-?\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|\+\d{2}:\d{2}|\b) 

, а затем использовать date_parse:

print_r(date_parse("2001-10-26T21:32:52")); 

См IDEONE demo

+0

Я знаю, что фактическая проверка должна выполняться на «реальном» языке программирования. Просто хотел что-то, что проверяет большинство вещей в одной команде. – Xenonite

+0

Есть более эффективные способы использования регулярных выражений, чем проверка значений даты и времени. Существует одно правило: если это проще и удобнее обслуживать без регулярного выражения, не используйте регулярное выражение. Это была бы длинная бессмысленная строка, которую трудно было бы настроить в случае изменения формата даты и времени. –