Я был бы склонен использовать следующее регулярное выражение здесь:
(?<![\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: группа без захвата