Шаблон регулярного выражения для соответствия времени, например «1 час 10 минут»

Я пытаюсь создать приложение для отслеживания времени, которое должно анализировать строку, которая может иметь (но не всегда) время в одном из многих форматов или комбинаций. Форматы, которые я проверяю,

  • ч|час|часы|часы
  • м|мин|мин|минут

Они могут быть с пробелом между числом и часами или минутами и могут быть объединены или только одно или другое. Некоторые примеры:

  • 1h
  • 1 час 20 минут
  • 2 часа 15 м

Регулярное выражение для сопоставления времени, которое у меня есть в настоящее время:

((\d+(\.\d+)?)\s*(h|hr|hrs|hours))?(\s*(\d+)\s*(m|min|mins|minutes))?

Это отлично работает, если я просто передаю ему строку времени без чего-либо перед ней. Моя проблема в том, что я хочу проанализировать полную текстовую строку со временем, появляющимся в любом месте. Некоторые примеры:

  • Запись времени для некоторой работы 1ч 15м
  • 2 часа 45 минут Это время для некоторой работы
  • Это запись времени 1 час 25 минут для некоторой работы
  • Это временная запись для некоторой работы

Есть ли у кого-нибудь предложения о том, как с этим справиться?


person tanc    schedule 26.08.2015    source источник
comment
Возможно, ((\d+(?:\.\d+)?)\s*(?:hours?|h(?:r|rs)?))?(?:\s*((\d+)\s*(?:minutes|mins?|m)))?   -  person Wiktor Stribiżew    schedule 26.08.2015


Ответы (1)


Все, что вам действительно нужно сделать, это сделать множественное число s необязательным и добавить несколько токенов границ слов.

Пытаться:

\b((\d+(\.\d+)?)\s*(h|hr|hrs?|hours?))?(\s*(\d+)\s*(m|min|mins?|minutes?))?\b 
person Ron Rosenfeld    schedule 26.08.2015
comment
Отличный ответ, спасибо! Это была граница слова, с которой я в основном застрял, это полезно запомнить. Спасибо! - person tanc; 26.08.2015