Question

Je voudrais Valider et Extrait les heures et minutes d'une chaîne en utilisant Regex dans .NET. Juste pour récupérer les deux nombres, séparés (ou non) par :. format accepté h:m ou m. Unaccepted :m, h:.

EDIT: Ceci est de noter que le nombre de heures pourrait déborder du 23 au ... 32 .

Le trop-plein pendant des heures (plus de 32) et minutes (sur 59) Je vais faire après la récupération des valeurs (int.Parse)


* juste pour le fun peut-être il aa regex relativement simple qui pourrait filtrer aussi> 32 pour une heure et> 59 pour minute (pour minutes il pourrait être [0-5]*[0-9], pendant des heures, je ne sais pas)?

Était-ce utile?

La solution 4

Enfin, le code de validation (jusqu'à 32), ainsi que l'obtention de valeurs est (version 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

Merci tout le monde contribue à cette réponse!

Autres conseils

Êtes-vous mort perchées sur une regex? Parce que DateTime.Parse serait beaucoup plus simple et plus puissant ici.

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

Alors dt vous donne tout ce que vous devez savoir sur le temps. DateTime.TryParse() peut-être mieux au cas où vous êtes moins certain que c'est une chaîne de temps.

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

Si vous voulez valider heures:

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

modifier :. Testé et corrigé


Cependant, la meilleure façon de le faire est avec DateTime.ParseExact, comme ceci: (testé)

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;

Pour la validation, vous pouvez utiliser TryParseExact .

Voici la chaîne regex. Vous pouvez accéder aux groupes de capture nommés « heures » et « minutes ». Utilisez des drapeaux "ExplicitCapture" et "Singleline".

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

Vous pouvez tester regexes ici: http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx

Comme mentionné précédemment, un appel d'analyse syntaxique DateTime peut-être mieux à moins que vous devez valider que seule cette forme est autorisée.

En outre, les valeurs négatives ne sont pas autorisées, ni des décimales. (Mais, l'expression rationnelle peut être modifiée pour les inclure si nécessaire).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top