Регулярное выражение соответствует нулю или один раз строка

Я занимался этим более часа, но безуспешно, и мне в голову.

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

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

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

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

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

FB.

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

Я использовал такой же подход, как этот:

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

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

РЕДАКТИРОВАТЬ: если я добавлю пробел, как этот Regex dateFormatRegex = new Regex(@" (HH)?:?(MM)?:?(ss)?"); у меня будет результат, но я не хочу пробел ... Я думал, что первую скобку нужно экранировать, но (в этом случае (это не сработает), я полагаю, это не скобка, которая является частью строки для сопоставления, а ключевой символ.

12 голосов | спросил Louis Kottmann 27 AMpWed, 27 Apr 2011 02:22:59 +040022Wednesday 2011, 02:22:59

2 ответа


0

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

Однако, в вашем случае, если вы напишите дважды, это будет более читабельным:

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

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

ответил ThiefMaster 27 AMpWed, 27 Apr 2011 02:24:23 +040024Wednesday 2011, 02:24:23
0

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

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

(? <= ...) является шаблоном просмотра назад.

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

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

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

ответил bw_üezi 27 AMpWed, 27 Apr 2011 03:31:09 +040031Wednesday 2011, 03:31:09

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132