Регулярное выражение, ищущее время, не хочет быть нежадным

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

Вот регулярное выражение: \.*(0[1]|1[3-7]):\d\d:\d\d

Я пытался не жадничать, делая это: \.*?(0[1]|1[3-7]):\d\d:\d\d но это, похоже, не работает. Постановка вопросительного знака перед квантификатором ничего не дала для этой цели.

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

Спасибо,

Эндрю Н.

Изменить: я пытаюсь добиться от регулярного выражения что-то вроде «13:04:57» вместо всей даты.

Пример строки: Получено: от 127.0.0.1 с SMTP-идентификатором co5csp22954317qdb; Ср, 6 мая 2015 г., 13:02:22 -0700 (PDT) X-получено: 127.0.0.1 с SMTP-идентификатором j185mr26699743oig.68.1430928141923; Ср, 06 мая 2015 г., 13:02:21 -07:00 (PDT)


person user3761389    schedule 04.06.2015    source источник
comment
Можете ли вы опубликовать некоторые образцы данных для игры?   -  person Adam MacDonald    schedule 04.06.2015
comment
Пожалуйста, добавьте эти образцы строк в вопрос и добавьте ожидаемый результат. Кроме того, помогает ли ((?:0[1-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]).*? Просто возьмите содержимое первой группы захвата.   -  person Wiktor Stribiżew    schedule 04.06.2015
comment
stribizhev - тот по-прежнему возвращает два совпадения (в этом фрагменте заголовка).   -  person user3761389    schedule 04.06.2015
comment
@ user3761389: Мое регулярное выражение выше вернет всю строку по истечении времени, но значение находится внутри группы захвата.   -  person Wiktor Stribiżew    schedule 04.06.2015
comment
Должно быть, я использовал другой тестер регулярных выражений. Теперь я понимаю, что вы имеете в виду. Похоже, также делает то, что мне нужно. Спасибо!   -  person user3761389    schedule 04.06.2015


Ответы (2)


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

/^(?:(?!(?:0[1]|1[3-7]):\d\d:\d\d).)*((?:0[1]|1[3-7]):\d\d:\d\d)/m

(?!...) - это отрицательный просмотр вперед, который гарантирует, что нет другого экземпляра времени, прежде чем сопоставлять время, таким образом, сопоставляя только первый экземпляр.

Демо RegEx

person anubhava    schedule 04.06.2015
comment
Это сделало это. Спасибо! - person user3761389; 04.06.2015
comment
Кроме того, как бы вы начали разбор с самого первого экземпляра этого? Я заметил, что перемещался вниз по странице некоторое время из какой-то другой области (это соответствовало бы регулярному выражению: Получено: по (ip) с идентификатором SMTP (id); Среда, 6 мая 2015 г., 08:58:05 -0700 ( ТИХООКЕАНСКОЕ ЛЕТНЕЕ ВРЕМЯ) - person user3761389; 04.06.2015
comment
08:58:05 также должно совпадать в этой строке. Вы можете поиграть с моей демо-ссылкой и предоставить там образцы данных. - person anubhava; 04.06.2015

{1} соответствует предыдущему шаблону 1 раз. Если вы опубликуете пример заголовка, я могу протестировать REGEX, чтобы убедиться, что я все делаю правильно. Попробуйте следующее.

(.*(0[1]|1[3-7]):\d\d:\d\d){1}
person Nathan    schedule 04.06.2015