регулярное выражение hour:минута (час > 24)
Вопрос
Я бы хотел подтвердить и извлечь в часы и минуты из строки использование регулярного выражения в .NET.Просто для восстановления двух чисел, разделенных (или нет) на :
.Принятый формат
h:m
или m
.Неприемлемый :m
, h:
.
Редактировать:Это делается для того, чтобы отметить, что количество часы работы может переполнить кассу 23... 32.
Переполнение в течение часов (более 32) и минут (более 59) Я сделаю это после восстановления значений (int.Parse)
* просто для развлечения может быть, есть относительно простое регулярное выражение, которое могло бы фильтровать также > 32 для часа и > 59 для минуты (для минуты это могло бы быть [0-5]*[0-9]
, в течение нескольких часов, я не знаю)?
Решение 4
Наконец, код для проверки (до 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
Спасибо всем, кто внес свой вклад в этот ответ!
Другие советы
Вы намертво зациклились на регулярном выражении?Потому что DateTime.Parse
здесь было бы намного проще и мощнее.
DateTime dt = DateTime.Parse("12:30 AM");
Затем dt дает вам все, что вам нужно знать о времени. DateTime.TryParse()
может быть лучше, если вы менее уверены, что это временная строка.
(?:(\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;
Для проверки вы можете использовать Попробуйте проанализировать.
Вот строка регулярного выражения.Вы можете получить доступ к именованным группам захвата "часы" и "минуты".Используйте флаги "ExplicitCapture" и "Singleline".
@"^((?<hours>[0-9]{1,2}):)?(?<minutes>[0-9]{1,2})$"
Вы можете протестировать регулярные выражения здесь: http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx
Как уже упоминалось, вызов синтаксического анализа DateTime может быть лучше, если только вам не нужно подтвердить, что разрешена только эта форма.
Кроме того, отрицательные значения недопустимы, как и десятичные дроби.(Но регулярное выражение может быть изменено, чтобы включить их, если это необходимо).