Что такое идеальный шаблон регулярного выражения для метки времени с часовым поясом? - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь сохранить временные метки с часовыми поясами, и мне нужен шаблон регулярных выражений, чтобы сделать это правильно. Формат иллюстрируется с помощью приведенных ниже примеров:

2014-12-01 17:15:52
2014-12-01 17:15:52.213121
2014-12-01 17:15:52 Africa/Cairo
2014-12-01 17:15:52.213121 Africa/Cairo

Все действительные метки времени. Другими словами, точность микросекунд необязательна, как и часовой пояс. Часовой пояс можно рассматривать как строку. Пока что у меня есть следующая схема:

r'^\d\d\d\d-(0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|3[01]) (00|[0-9]|1[0-9]|2[0-3]):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])*$'

Это хорошо для хранения только необходимой части, то есть без точности микросекунд и часового пояса. Я немного растерялся, как к этому подойти.

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

Спасибо за любую помощь.

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

1 Ответ

0 голосов
/ 05 января 2019

Вы можете обновить свое регулярное выражение, добавив 2 необязательные группы без захвата в конце своего регулярного выражения, чтобы они соответствовали точке и 1+ цифрам, таким как .213121 и соответствовали шаблону с косой чертой, такой как Africa/Cairo, используя \S для соответствует любому непробельному символу.

Если \S слишком широк для соответствия, вы можете указать класс символов , перечисляющий все разрешенные символы.

(?:\.\d+)?(?: \S+\/\S+)?$

См. обновленное регулярное выражение

Обратите внимание, что эта группа ([0-9]|[0-5][0-9])* не нуждается в квантификаторе, поэтому вы можете опустить *

Если то, что находится до и после косой черты, также может содержать пробелы, вы также можете использовать:

(?:\.\d+)?(?: [^\r\n\/]+\/[^\r\n\/]+)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...