Что такое шаблон регулярного выражения для datetime (2008-09-01 12:35:45)?

Что такое шаблон RegEx для DateTime (2008-09-01 12:35:45)?

Я получаю эту ошибку:

Конечный разделитель '^' не найден

С помощью:

preg_match('(?n:^(?=\d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(?(.0?2)(?=.{3,4}(1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))|0?[1-9]|1\d|2[0-8])(?<sep>[/.-])(?<month>0?[1-9]|1[012])\2(?<year>(1[6-9]|[2-9]\d)\d{2})(?:(?=\x20\d)\x20|$))?(?<time>((0?[1-9]|1[012])(:[0-5]\d){0,2}(?i:\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$)', '2008-09-01 12:35:45'); 

Дает эту ошибку:

Предупреждение: preg_match () [function.preg-match]: Ошибка компиляции: ничего не повторить со смещением 0 в E: \ www \ index.php в строке 19

@Espo: Мне просто нужно сказать, что regex невероятно. Мне бы очень хотелось написать код, который сделал что-то полезное в матчах, например, если вы действительно хотите узнать, какую дату и время пользователь вводил.

Похоже, решение Тома было бы более приемлемым, поскольку это примерно в два миллиона раз проще и с добавлением некоторых круглых скобок вы можете легко получить значения, введенные пользователем:

 (\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}) 

Если вы используете perl, вы можете получить значения с чем-то вроде этого:

 $year = $1; $month = $2; $day = $3; $hour = $4; $minute = $5; $second = $6; 

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

Простая версия, которая будет работать для указанного формата, но не всех остальных по @Espos:

 (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) 

http://regexlib.com/REDetails.aspx?regexp_id=610

^ (? = \ D) (:( ?: 31 ((?: 0 [2469] | 11)) | (:?!.? 30 | 29) (0 2) | 29 (?!.? ? = 0,0 2. (:( 🙁 ?: 1 [6-9] |? [2-9] \ г)? (0 ?: [48] | [2468] [048] | [13579] [ 26]) | (:( ?: 16 | [2468] [048] | [3579] [26]) 00))) (?: \ x20 | $)) | (:? 2 [0-8] | 1 \ д | 0 [1-9])) ([- /.]) (?: 1 [012] | 0 [1-9]) \ 1 (:??? 1 [6-9] | [2 -9] \ d) \ d \ d ((= \ x20 \ d?) \ x20 | $)) (((0 [1-9] | 1 [012]?) (?:? [0- 5] \ г) {0,2} (\ х20 [П.] М)) | ([01] \ д | 2 [0-3]) (: [0-5] \ г) {1,2}) ? $


Этот RE проверяет как даты, так и / или временные шаблоны. Дни в феврале также проверяются на високосные годы. Даты: в формате dd / mm / yyyy или d / m / yy между 1/1/1600 – 31/12/9999. Ведущие нули являются необязательными. Сепараторы даты могут быть либо совпадающими тире (-), либо слэшами (/), либо периодами (.) Времена: в формате часов h: MM: ss AM / PM 12 часов (12:00 AM – 11:59:59 PM) или hh : MM: ss военный формат времени (00:00:00 – 23:59:59). 12-часовой формат времени: 1) может иметь начальный ноль в течение часа. 2) Минуты и секунды являются необязательными для 12-часового формата. 3) AM или PM необходимы и чувствительны к регистру. Военное время 1) должно иметь начальный ноль за все часы менее 10. 2) Протоколы являются мандатными. 3) секунды являются необязательными. Datetimes: сочетание вышеуказанных форматов. Сначала дата, затем время, разделенное пробелом. ex) dd / mm / yyyy hh: MM: ss


Изменить : убедитесь, что вы скопировали RegEx с сайта regexlib.com, поскольку StackOverflow иногда удаляет / уничтожает специальные символы.

 $date = "2014-04-01 12:00:00"; preg_match('/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/',$date, $matches); print_r($matches); 

$ match будут:

 Array ( [0] => 2014-04-01 12:00:00 [1] => 2014 [2] => 04 [3] => 01 [4] => 12 [5] => 00 [6] => 00 ) 

Простой способ разбить стробированную строку datetime.

 ^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1]))$|^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1])\s([0-1]\d|[2][0-3])\:[0-5]\d\:[0-5]\d)$ 

Вы должны найти то, что ищете, по адресу http://regexlib.com/DisplayPatterns.aspx?cattabindex=4&categoryId=5 .

относительно ответа Имрана с 1 сентября 2008 года в 12:33, отсутствует: в шаблоне правильные шаблоны

 preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m1); print_r( $m1 ); preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m2); print_r( $m2 ); preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45', $m3); print_r( $m3 ); 

это возвращает

 Array ( [0] => 2008-09-01 12:35:45 ) Array ( [0] => 2008-09-01 12:35:45 ) Array ( [0] => 2008-09-01 12:35:45 ) 

Вот мое решение:

 /^(2[0-9]{3})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01]) (0[0-9]|1[0-9]|2[0123])\:([012345][0-9])\:([012345][0-9])$/u 

Я изменил шаблон регулярного выражения из http://regexlib.com/REDetails.aspx?regexp_id=610 . Следующий шаблон должен соответствовать вашему делу.

 ^(?=\d)(?:(?:1[6-9]|[2-9]\d)?\d\d([-.\/])(?:1[012]|0?[1-9])\1(?:31(?<!.(?:0[2469]|11))|(?:30|29)(?<!.02)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$ 

ГГГГ-ММ-ДД ЧЧ: ММ: СС

Вот мое решение:

 [12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]) ([01][0-9]|2[0-3]):[0-5]\d 

Визуализация регулярных выражений

Демоверсия Debuggex

https://regex101.com/r/lbthaT/4

Для функций PHP preg требуется, чтобы ваше регулярное выражение было обернуто символом-разделителем, который может быть любым символом. Вы не можете использовать этот символ разделителя, не выходя из регулярного выражения. Это должно работать (здесь символ разделителя есть /):

 preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45'); // or this, to allow matching 0:00:00 time too. preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45'); 

Если вам нужно сопоставить строки, содержащие только дату и время, добавьте ^ и $ в начало и конец регулярного выражения.

 preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45'); 

Ссылка на PHP preg_match ()

Вот упрощенная версия (возникла из ответа Эспо). Он проверяет правильность даты (даже високосный год), а hh: mm: ss необязательно
Примеры, которые работают:
– 31/12/2003 11:59:59
– 29-2-2004

 ^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))(|([01]\d|2[0-3])(:[0-5]\d){1,2})?$