Regex соответствует нулевой или однократной строке

Я был в этом более часа, без успеха, и это делало мою голову.

Я пытаюсь создать Regex, который соответствует этой строке {Date HH: MM: ss}, но здесь трюк, HH, MM и ss являются необязательными, но это должно быть "HH", а не только "H" (то же самое относится к MM и ss). Если появляется одно "H", строка не должна совпадать.

Я знаю, что могу использовать H {2} для соответствия HH, но я не могу использовать эту функциональность плюс? для совпадения нуля или одного времени (ноль, поскольку он является необязательным, и один раз макс).

Пока я делаю это (что явно не работает):

Regex dateRegex = new Regex(@"\{Date H{2}?:M{2}?:s{2}?\}");

Пожалуйста, помогите мне и извините за вопрос noob.

FB.

Следующий вопрос, теперь, когда у меня есть совпадение в первой строке, я хочу взять только часть HH: MM: ss и поместить ее в другую строку (это будет формат объекта TimeStamp).

Я использовал тот же подход, например:

Regex dateFormatRegex = new Regex(@"(HH)?:?(MM)?:?(ss)?");

Но когда я пытаюсь это сделать на "{Date HH: MM}", я не получаю совпадений, почему?

EDIT: если я добавляю пробел, подобный этому Regex dateFormatRegex = new Regex(@" (HH)?:?(MM)?:?(ss)?");, я получаю результат, но мне не нужно пространство... Я думал, что для первого родительского элемента нужно было экранировать, но (в этом случае я не буду работать, потому что это не родительский элемент, который является частью строки, которая соответствует, но ключевому символу.

Ответ 1

(H{2})? Соответствует нулю или двум символам H.

Однако в вашем случае его запись будет более понятной:

Regex dateRegex = new Regex(@"\{Date (HH)?:(MM)?:(ss)?\}");

Кроме того, убедитесь, что нет доступных функций для всех, что вы пытаетесь сделать. Синхронизация дат довольно распространена, и большинство языков программирования имеют функции в своей стандартной библиотеке - я бы поставил 1к моей репутации, что .NET тоже имеет такую ​​функцию.

Ответ 2

В вашем редактировании вы указываете на нежелательное ведущее пространство в результате... чтобы проверить состояние ведущего или конечного состояния вместе с вашим регулярным выражением, не включив его в результат, вы можете использовать функцию поиска regex.

new Regex(@"(?<=Date )(HH)?:?(MM)?:?(ss)?")

(? < =...) является шаблоном lookbehind.

тестовый сайт Regex в этом примере.

изменить
для ввода Date HH:MM:ss будет соответствовать как регулярному выражению (с или без lookbehind).
но ввод FooBar HH:MM:ss по-прежнему будет соответствовать простому регулярному выражению, но здесь не будет выглядеть lookbehinde. Lookaround не изменяет содержимое результата, но предотвращает ложные совпадения (например, этот второй вход, который не является датой)

найти дополнительную информацию о регулярном выражении и поиске здесь