час регулярного выражения: минута (час> 24) - PullRequest
0 голосов
/ 04 января 2010

Я бы хотел проверить и извлечь часов и минут из строки с помощью Regex в .NET. Просто чтобы восстановить два числа, разделенных (или нет) на :. Принятый формат h:m или m. Непринято :m, h:.

EDIT: Следует отметить, что число часов может превысить 23 до ... 32 .

Переполнение для часов (более 32) и минут (более 59), которые я буду делать после восстановления значений (int.Parse)


* просто для удовольствия может быть, есть относительное простое регулярное выражение, которое может фильтровать также> 32 для часа и> 59 для минуты (для минут это может быть [0-5]*[0-9] часами не знаю)

Ответы [ 4 ]

8 голосов
/ 04 января 2010

Вы мёртвые настроены на регулярное выражение? Потому что DateTime.Parse будет гораздо проще и мощнее.

 DateTime dt = DateTime.Parse("12:30 AM");

Тогда ДТ даст вам все, что вам нужно знать о времени. DateTime.TryParse() может быть лучше, если вы менее уверены, что это временная строка.

2 голосов
/ 04 января 2010

(?:(\d\d?):)?([0-5][0-9])

Если вы хотите проверить часы:

(?:([01]?[0-9]|2[0-3]):)?([0-5][0-9])

РЕДАКТИРОВАТЬ : проверено и исправлено.


Однако, лучший способ сделать это с помощью DateTime.ParseExact, например так: (проверено)

TimeSpan time = DateTime.ParseExact(
    input, 
    new string[] { "HH:mm", "H:mm", "mm", "%m" }, //The % is necessary to prevent it from being interpreted as a single-character standard format.
    CultureInfo.InvariantCulture, DateTimeStyles.None
).TimeOfDay;

Для проверки вы можете использовать TryParseExact .

1 голос
/ 04 января 2010

Вот строка регулярных выражений. Вы можете получить доступ к именованным группам захвата «часы» и «минуты». Используйте флаги "ExplicitCapture" и "Singleline".

@ "^ (( [0-9] {1,2}):?) ( [0-9] {1,2}) $"

Вы можете проверить регулярные выражения здесь: http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx

Как уже упоминалось, вызов синтаксического анализа DateTime может быть лучше, если вам не нужно проверять, разрешена ли только эта форма.

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

0 голосов
/ 11 января 2010

Наконец, код для проверки (до 32) и получения значений (версия vb.net):

Dim regexHour As New Regex( _ 
   "((?<hours>([012]?\d)|(3[01]))\:)?(?<minutes>[0-5]?\d)", _
    RegexOptions.ExplicitCapture)
Dim matches As MatchCollection = regexHour.Matches(value)

If matches.Count = 1 Then
  With matches(0)
    ' (!) The first group is always the expression itself. '
    If .Groups.Count = 3 Then ' hours : minutes '
      strHours = .Groups("hours").Value
      If String.IsNullOrEmpty(strHours) Then strHours = "0"
      strMinutes = .Groups("minutes").Value
    Else ' there are 1, 3 or > 3 groups '
      success = False
    End If
  End With
Else
  success = False
End If

Спасибо всем, кто внес свой вклад в этот ответ!

...