Регулярное выражение для сопоставления даты и нескольких необязательных временных шаблонов - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь написать регулярное выражение, которое может соответствовать этим форматам

  • гггг / мм / дд

  • гггг / мм / дд чч

  • гггг / мм / дд чч: мм

  • гггг / мм / дд чч: мм: сс

  • гггг / мм / дд чч: мм: сс: мс (3 цифры для мс)

Любой может помочь мне и объяснить, как думать, когда мне нужно установить необязательные группы для полей времени?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Я был бы склонен использовать следующее регулярное выражение здесь:

(?<![\d\/])\d{4}(?:\/\d{2}){2}(?: \d{2}(?::\d{2}(?::\d{2}(?::\d{1,3})?)?)?)?(?![\d:]| *(?::|\d+:))

PCRE demo

Это соответствует строкам

2020/03/22
2020/03/22 07
2020/03/22 07:19
2019/02/29 22:16:43
2020/02/32 18:14:61:23 

но не соответствует этим

2020/02/32 18:14:61:23:61 
1234/2020/03/22
2020/02/32 18:1461:23

Обратите внимание, что последние две строки, которые соответствуют, не составляют допустимое время. Я мог бы изменить регулярное выражение, чтобы пометить 2020/02/32 как недопустимую дату, но не (с регулярным выражением, которое короче футбольного поля), чтобы признать, что 2019/02/29 недействительно. Я считаю, что кто-то либо желает подтвердить правильность времени, либо нет, и для этого необходимо будет использовать окончательную проверку для каждой строки, которая, как считается, регулярное выражение представляет время, поэтому число недопустимых раз переданный регулярным выражением будет второстепенным. Более важно убедиться, что совпадениям не предшествуют и не следуют символы, которые ставят совпадение под сомнение.

Механизм регулярных выражений выполняет следующие операции.

(?<!                # begin negative lookbehind
  [\d\/]            # match a digit or '/'
)                   # end negative lookbehind
\d{4}               # match 4 digits
(?:\/\d{2})         # match '/', then 2 digits in a NCG
{2}                 # match the preceding NCG 2 times
(?: \d{2}           # begin NCG, match a space, 2 digits
  (?::\d{2}         # begin NCG, match ':', 2 digits
    (?::\d{2}       # begin NCG, match ':', 2 digits
      (?::\d{1,3})  # match ':', 1-3 digits in NCG
      ?             # make NCG optional       
    )?              # end NCG and make optional
  )?                # end NCG and make optional
)?                  # end NCG and make optional
(?!                 # begin negative lookahead
  [\d:]             # match a digit or ':'
  |                 # or
  \ *               # match 0+ spaces
  (?:               # begin NCG
    :               # match ':'
    |               # or
    \d+:            # match 1+ digits, then ':' 
  )                 # end NCG
)                   # end negative lookahead

NCG: группа без захвата

0 голосов
/ 23 апреля 2020
\b[12]\d{3}\/(?:0[1-9]|1[0-2])\/(?:0[1-9]|[1-2]\d|3[0-1])(?: (?:[0-1]\d|2[0-3])(?::[0-5]\d(?::[0-5]\d(?::\d{3})?)?)?)?\b

https://regex101.com/r/7YBgYx/2

Посетите эту демонстрационную ссылку и найдите подробное объяснение в правом верхнем углу.


ВАЖНОЕ ПРИМЕЧАНИЕ: Это решение принимает любой год 1000-2999, любой месяц 01-12, любой день 01-31, любой час 00-23, любую минуту 00-59, любую секунду 00-59 и любую миллисекунду 000-999 , Решение не выполняет проверку даты, поэтому допускается, например, February 30 или June 31, хотя такие даты являются недействительными.

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