2017-02-27 1 views
1

ich mit folgenden Bedingungen regex müssenbenötigen regulären Ausdruck mit mehreren Bedingungen

  • Es sollte bis zu 3 Dezimalstellen maximal 5 Ziffern akzeptieren dann
  • es negativ sein kann
  • kann es Null sein
  • es kann nur Zahlen sein (max. bis zu 5 Ziffernstellenausrichtmittel)
  • kann null sein

Ich habe folgende versucht, aber es ist nicht, die Erfüllung seiner nicht alle möglichen Bedingungen

@"^([\-\+]?)\d{0,5}(.[0-9]{1,3})?)$" 

Z.B. Maximalwert kann von -99999.999 bis 99999.999 sein

+0

Zum einen müssen Sie das '.' Wie '\. Wenn es ein nackter Punkt ist, bedeutet es "irgendeinen Charakter", der dir hier definitiv Schmerzen bereiten wird. Wenn Sie können, empfehle ich, die leere/Null-Prüfung außerhalb der Regex. Wie: 'valueIsOk = value.blank? || value.match? (regex) '. Wenn nicht, klopfen Sie einfach ein "?" Außerhalb der letzten Klammer. – mroach

+0

Ihre vierte Regel widerspricht Ihrer ersten Regel. Ihr Muster implementiert eine Zeilenanfangs- und Zeilenende-Regel, die in Ihren Regeln nicht aufgeführt sind. Kein regulärer Ausdruck kann mit 'null' umgehen: Meinst du 'leer'? Wenn ich dies als eine Spezifikation gegeben hätte, würde ich es als mehrdeutig ablehnen. – EJP

+1

10 @EJP Wenn Sie sich so fühlen, warum haben Sie dann geantwortet? –

Antwort

1

Mit dieser regex:

^[-+]?\d{0,5}(\.[0-9]{1,3})?$ 

Ich habe hier nur zwei Änderungen vorgenommen. Zuerst müssen Sie nicht müssen alle Zeichen in einer Zeichenklasse normal, mit Ausnahme von öffnenden und schließenden Klammern oder möglicherweise Backslash selbst. Daher können wir [-+] verwenden, um ein anfängliches Plus oder Minus zu erfassen. Zweitens müssen Sie dem Punkt in Ihrer Regex entkommen, um der Engine mitzuteilen, dass Sie einen literalen Punkt abgleichen möchten.

Allerdings würde ich wahrscheinlich Ausdruck dieses Regex wie folgt:

^[-+]?\d{1,5}(\.[0-9]{1,3})?$ 

Dieser 04.59 Ziffern übereinstimmen, gefolgt von einem optionalen Komma, gefolgt von 2.59 Ziffern.

Bitte beachte, dass wir wollen, erfassen Dinge wie:

0.123 

Aber nicht

.123 

das heißt, wir wollen keine führende Komma erfassen sollte es nicht von mindestens einem vorangestellt werden Nummer.

Demo hier:

Regex101

+0

Entschuldigung für Verwirrung halten ... bis ich meine, dass 5 Ziffern bis 99999 oder bis zu drei Dezimalstellen i bedeutet .999, dass max – Mahajan344

+0

^[- +]? \ d {0,5} (\. [0-9] {1,3}) $ $ halten kann, ist perfekt, da es sowohl .123 als auch 0 erlaubt.123, Benutzer eingegeben in der Regel mit 0 vor dem Dezimaltrennzeichen – Mahajan344

0

Ich nehme an, du machst dies in C# mit der Notation. Hier ist ein kleiner Code, den Sie verwenden können, um Ihren Ausdruck mit zwei Korrekturen zu testen:

  1. Sie müssen den Punkt zu entkommen, sonst bedeutet es "jedes Zeichen". Also, \. statt .
  2. Es war ein Fremdschließende Klammer, die die Expression verhindert Kompilieren

C#:

var expr = @"^([\-\+]?)\d{0,5}(\.[0-9]{1,3})?$"; 
var re = new Regex(expr); 
string[] samples = { 
    "", 
    "0", 
    "1.1", 
    "1.12", 
    "1.123", 
    "12.3", 
    "12.34", 
    "12.345", 
    "123.4", 
    "12345.123", 
    ".1", 
    ".1234" 
}; 
foreach(var s in samples) { 
    Console.WriteLine("Testing [{0}]: {1}", s, re.IsMatch(s) ? "PASS" : "FAIL"); 
} 

Ergebnisse:

Testing []: PASS 
Testing [0]: PASS 
Testing [1.1]: PASS 
Testing [1.12]: PASS 
Testing [1.123]: PASS 
Testing [12.3]: PASS 
Testing [12.34]: PASS 
Testing [12.345]: PASS 
Testing [123.4]: PASS 
Testing [12345.123]: PASS 
Testing [.1]: PASS 
Testing [.1234]: FAIL 
+0

Entschuldigung für Verwirrung ... bis ich meine, dass 5 Ziffern bis 99999 oder bis zu drei Dezimalstellen ich .999, dass max kann es – Mahajan344

0

Es sollte maximal 5 Ziffern akzeptieren

[0-9]{1,5} 

dann bis zu 3 Dezimalstellen

[0-9]{1,5}(\.[0-9]{1,3})? 

kann

[-]?[0-9]{1,5}(\.[0-9]{1,3})? 

es

Null sein kann

bereits abgedeckt negativ sein.

kann es nur Zahlen sein (max. Bis zu 5 Ziffernstellenausrichtmittel)

bereits abgedeckt. 'Bis zu fünf Stellen' widerspricht Ihrer ersten Regel, die 5.3 erlaubt.

kann

Nicht abgedeckt null sein. I stark vorschlagen, dass Sie diese Anforderung entfernen. Auch wenn Sie "leer" meinen, wie ich es aufrichtig hoffe, sollten Sie diesen Fall separat und im Voraus erkennen, da Sie sicherlich anders damit umgehen müssen.

Ihr regulärer Ausdruck enthält ^ und $. Ich weiß nicht warum. In den von Ihnen angegebenen Regeln gibt es keinen Zeilenanfang oder Zeilenende. Es erlaubt auch eine führende +, die wiederum nicht in Ihren Regeln angegeben ist.