2016-03-28 16 views
1

Ich mag einen regulären Ausdruck für diese bestimmten Muster erstellen:Regex - Format HH: MM, Stunden> = 24, negativer Wert

  • Es mit '+' oder starten sollte '-' oder gar nichts.
  • Nummer oder Stunden. Es kann mit beginnen '0' (z 00 => 0, 1 => 1, 01 => 1, 0.000.089 => 89)
  • gefolgt von ':'
  • Dann wird die Anzahl von Minuten.

(Max 59, es kann auch mit nur einem '0', 09 => 9, 9 => 9 starten) Das ist, was ich bisher habe:

private string regexPattern = @"^" + // Start of string (anchor) 
           "(" + // begin capturing group 
           "(+|-)?" + // "+" or "-" - is optional 
           "(0*)?" + // a "0" - is optional 
           "[0-9]*" + // accepts any number of digits 
           ")" + // end capturing group 
           ":" + "(" + // start capturing 
           "[0 - 5]" + // character between 0 and 5 
           "\\d" + // one digit 
           ")" + // end group 
           "$"; // end of string anchor 

Aber ich erhalte einen Syntaxfehler:

System.ArgumentException : parsing "^((+|-)?(0)?[0-9]+):([0 - 5]\d)$" - Quantifier {x,y} following nothing.

Ich weiß nicht, ob mein Muster korrekt erstellt wird.

Jede Hilfe würde sehr geschätzt werden.

+0

Sie müssen 'escape' die '+' als' \ + 'oder wie pro Ihre Sprache in' (+ | -) ' – rock321987

+0

Sie müssen auch Leerzeichen entfernen zwischen' [0 - 5] ' . Es sollte '[0-5]' – rock321987

+0

ein Regex ist nicht das richtige Werkzeug, um einen Stundenwert zu analysieren. Die Werte in der Regex haben Kontext, in diesem Fall gibt es bessere Werkzeuge. Wenn Sie C# verwenden, ist DateTime.TryParse eine bessere Option. Das Erkennen von 24 vs 34 vs 25 macht Ihre Regex sehr komplex. – Peter

Antwort

0

ein paar Dinge in Ihrem regex Es gibt, die verbessert werden müssen, können so mit dem vollständigen Muster beginnen: ^((?:\+|-)?[0-9]+):([0-5]?\\d)$

ich habe:

  • die + entkam -sign und machte (?:\+|-)? ein nicht -Einfangfunktion Gruppe - aber man könnte auch [+-]?, Muster ^([+-]?[0-9]+):([0-5]?\\d)$ würde verwenden dann - darauf hinzuweisen, nur die fehlende Flucht wollte
  • von [0-9]+(0*)? als bereits erfaßt entfernt
  • geändert [0-9]*-[0-9]+, wie sollte es mindestens eine Zahl vor dem Doppelpunkt
  • entfernt, die Räume von [0 - 5] und machte es optional (einstellige Zahlen scheinen gültig zu sein von Ihrer Frage) =>[0-5]?
seine
+0

Ich habe ein bisschen dein Muster geändert:^(((?: \\ + | -)? [0-9] +): ([0-5]? \\ d))?$ Im Falle einer leeren Zeichenfolge möchte ich mein Muster übereinstimmen. Alle meine Unit Tests bestanden. Vielen Dank! – POIR

1

Die unmittelbare Ursache des Fehlers ist, dass Sie +: \+ entkommen müssen. Die vorgeschlagene Muster ist

// Note \+ instead of just + 
    String pattern = @"^(\+|-)?[0-9]+:[0-5]?[0-9]$"; 

Erklärung

(\+|-)?  - either + or - or nothing 
    [0-9]+  - any digits, but at least 1, note that 000089 matchs [0-9]+ 
    :   - semicolumn 
    [0-5]?[0-9] - 0..59 with 00..09 possibility 

Sie haben keinen Code an, wo Sie die Gruppen verwenden, also habe ich sie fallen gelassen; Sie können jedoch leicht Gruppen wiederherstellen, wenn Sie möchten, z.

String pattern = @"^(?<hours>(\+|-)?[0-9]+):(?<minutes>[0-5]?[0-9])$"; 
Verwandte Themen