Pregunta

Me gustaría y extracto Validar horas y minutos de una cadena utilizando Regex en .NET. Sólo para recuperar los dos números, separados (o no) por :. formato aceptado h:m o m. :m no aceptada, h:.

EDIT: Este es tener en cuenta, que el número de horas podría desbordar el 23 y ... 32 .

El desbordamiento por horas (más de 32) y minutos (más de 59) que haré después de los valores de recuperación (int.Parse)


* sólo por diversión tal vez hay aa expresiones regulares relativamente simple que puede filtrar también la> 32 por hora y> 59 para minutos (por minutos Podría ser [0-5]*[0-9], durante horas, no sé)?

¿Fue útil?

Solución 4

Finalmente, el código de validación (hasta 32) y también la obtención de los valores es (vb.net versión):

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

Gracias a todos contribuir a esta respuesta!

Otros consejos

¿Está muerto fijan en una expresión regular? Debido DateTime.Parse sería mucho más simple y más potente aquí.

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

A continuación, dt le da todo lo que necesita saber sobre el tiempo. DateTime.TryParse() puede ser mejor si usted es menos cierto que es una cadena de tiempo.

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

Si desea validar horas:

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

Editar . Probado y corregido


Sin embargo, la mejor manera de hacerlo es con DateTime.ParseExact, así: (Probado)

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;

Para la validación, puede utilizar TryParseExact .

Aquí está la expresión regular. Puede acceder a los grupos de captura llamado "hora" y "minuto". Use banderas "ExplicitCapture" y "SingleLine".

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

Puede probar expresiones regulares aquí: http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx

Como se ha mencionado, una llamada de análisis DateTime podría ser mejor a menos que necesite validar que sólo se permite esta forma.

Además, los valores negativos no están permitidos, ni son decimales. (Sin embargo, la expresión regular se puede cambiar para incluir si es necesario).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top