Frage

Ich mag validate und Auszug Stunden und Minuten aus einem String mit Regex in .NET. Nur um die beiden Zahlen, getrennt (oder nicht) von : zu erholen. akzeptiert Format h:m oder m. Unaccepted :m, h:.

EDIT: Dies ist zu beachten, dass die Anzahl der Stunden , um die 23 bis ... Überlauf könnte 32 .

Der Überlauf für Stunden (über 32) und Minuten (über 59) I nach Werten Erholung (int.Parse) tun wird,


* nur zum Spaß vielleicht gibt aa relativ einfache regex, die auch die> 32 Stunden filtern konnten und> 59 für Minute (für Minuten es könnte sein, [0-5]*[0-9], stundenlang ich weiß nicht)?

War es hilfreich?

Lösung 4

Schließlich wird der Code (bis 32) für die Validierung und auch Werte zu erhalten ist (vb.net-Version):

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

Vielen Dank alle zu dieser Antwort beitragen!

Andere Tipps

Sind Sie tot auf einem regulären Ausdruck gesetzt? Da DateTime.Parse wäre viel einfacher und leistungsstärker hier.

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

Dann dt gibt Ihnen alles, was Sie brauchen, um über die Zeit wissen. DateTime.TryParse() kann besser sein, falls Sie weniger sicher, es ist ein Zeit-String.

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

Wenn Sie Stunden überprüfen:

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

Bearbeiten :. Getestet und korrigiert


Allerdings ist der beste Weg, dies zu tun, ist mit DateTime.ParseExact, wie folgt aus: (Geprüft)

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;

Für die Validierung, können Sie TryParseExact .

Hier ist der Regex-String. Sie können den Namen Einfanggruppen „Stunden“ und „Minuten“ zugreifen. Nutty "ExplicitCapture" und "Einlinige".

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

Sie können reguläre Ausdrücke testen hier: http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx

Wie bereits erwähnt, könnte ein Datetime-Parse-Anruf besser sein, es sei denn Sie müssen bestätigen, dass nur diese Form erlaubt.

Auch negative Werte sind nicht zulässig, weder sind Dezimalzahlen. (Aber kann die Regex geändert werden, um sie zu schließen, wenn erforderlich).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top