Domanda

Vorrei e estratto validate ore e minuti da una stringa utilizzando Regex in .NET. Giusto per recuperare i due numeri, separati (o meno) per :. formato accettato h:m o m. :m unaccepted, h:.

EDIT: Questo è da notare, che il numero di ore può traboccare il 23 sino ... 32 .

L'overflow per ore (oltre 32) e minuti (più di 59) che farò dopo i valori di recupero (int.Parse)


* solo per divertimento forse c'è aa semplice espressione regolare relativa che potrebbe filtrare anche la> 32 per un'ora e> 59 per minuto (per em> minuti < potrebbe essere [0-5]*[0-9], per ore non lo so)?

È stato utile?

Soluzione 4

Infine, il codice per la convalida (fino a 32) e di ottenere anche valori è (vb.net versione):

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

Grazie a tutti che contribuiscono a questa risposta!

Altri suggerimenti

Stai morto impostato su una regex? Perché DateTime.Parse sarebbe molto più semplice e più potente qui.

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

Poi dt ti dà tutto quello che c'è da sapere sul tempo. DateTime.TryParse() può essere meglio nel caso in cui si è meno certo è una stringa di tempo.

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

Se si desidera convalidare ore:

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

Modifica :. Testato e corretto


Tuttavia, il modo migliore per farlo è con DateTime.ParseExact, in questo modo: (testato)

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;

Per la convalida, è possibile utilizzare TryParseExact .

Ecco la stringa regex. È possibile accedere ai gruppi di cattura denominata "ore" e "minuti". Utilizzare bandiere "ExplicitCapture" e "SingleLine".

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

È possibile verificare regex qui: http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx

Come accennato, una chiamata parse DateTime potrebbe essere migliore se non è necessario verificare che solo questa forma è permesso.

Inoltre, i valori negativi non sono consentiti, né sono decimali. (Ma, l'espressione regolare può essere modificata per includere loro, se necessario).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top