2010-07-07 18 views
6

Kann mir jemand den regulären Ausdruck für die folgenden Muster liefern?Regulärer Ausdruck um Dollarbeträge zu vergleichen

1234 $

$ 31234,3

1234,56 $

$ 123456,78

$ .99

Meine Forderung ist die Ziffern vor dezimal 6 nicht überschreiten sollte und nach dem Komma sollte es nicht 2 Ziffern überschreiten. Bitte hilf mir. Vielen Dank im Voraus ..

+0

Ich denke, es gibt Regex Shortcuts/Aliase für Dezimalstellen, so dass alle diese Vorschläge, die [0-9] enthalten, möglicherweise durch diese ersetzt werden. –

+2

Es ist wahr und auf jeden Fall erwähnenswert. Ich verwende immer gerne expliziter, wenn die lange Form nicht viel mehr als die Abkürzungen ist. Für Dinge wie Leerzeichen ist es lästig, sie vollständig auszugeben, für alphanumerische Typen bedeutet das, dass sie für Leute, die weniger an Regex gewöhnt sind (und daher die Zeichenklassen-Shortcuts), auf einen Blick besser lesbar sind. – Chris

+0

Keine negativen Dollarbeträge, z. B. Rückerstattungen? –

Antwort

9
^\$(?=.*\d)\d{0,6}(\.\d{1,2})?$ 

(?=.*\d) stellt sicher, dass es mindestens eine Ziffer in der Zeichenfolge ist. Ohne diese würde der Regex ^\$\d{0,6}(\.\d{1,2})?$ mit der Zeichenfolge $ übereinstimmen.

Btw, der Lookahead muss nicht so lang sein; selbst eine einfache (?=.) würde tun, wie die Regex stellt sicher, dass die nachfolgenden Zeichen tatsächlich gültig sind. So kann es zu

^\$(?=.)\d{0,6}(\.\d{1,2})?$ 
+1

Was ist der Vorteil von (? =. */D) über/d {1,6} in der ersten Dezimalstelle? Ich fühle, dass ich hier etwas verpasse. – Lazarus

+1

@Lazarus '\ d {1,6}' erfordert mindestens eine Ziffer vor dem Dezimalpunkt - es wird nicht $ 99 passen. – Amarghosh

+0

Guter Punkt, schön :) Danke dafür. – Lazarus

4
^\$[0-9]{0,6}(\.[0-9]{1,2})?$ 
+0

Sie müssen diesen Dezimalpunkt zu entkommen - jetzt wird alles zusammenpassen. –

+0

Guter Punkt. Vielen Dank. Es ist erstaunlich, wie oft ich das mache und wie ich es nie bemerke, natürlich passt es zu einem Punkt ... ;-) – Chris

+0

Verstehst du nicht auch etwas anderes zu entkommen? @Hans – Amarghosh

1
/^\$([0-9]{0-6})|^\$([0-9]{0-6})+\.([0-9]{0-2})$|\$\.([0-9]{0-2})$/ 
2

Das Muster wäre vereinfacht werden:

Diese
^\$\d{0,6}(\.\d{0,2})?$ 

nicht überprüfen, ob es irgendwelche Ziffern sind so „$.“ ist eine gültige Übereinstimmung und ein gültiges Ergebnis bei den ursprünglichen Anforderungen des Fragestellers.

zu erklären:

^ Mittel passen nur, wenn es nicht vor der Zeichenfolge, die ich suche, das heißt „USD $ 123.45“ würde als $ in diesem Beispiel nicht (in Verbindung mit den \$) nicht unmittelbar nach dem Anfang der Zeichenfolge.

\$ stimmt mit dem $ -Zeichen überein, die Verwendung des Backslash() heißt Escaping und wird verwendet, um reservierte Zeichen (die etwas im Kontext des regulären Ausdrucks bedeuten) in diesem Fall $ zuordnen zu können Ende der Schnur, das heißt es gibt keine Zeichen nach diesem Punkt

\d wird jede Dezimalzeichen übereinstimmen, dh 0-9

{n,m} wird von n auf m Instanzen des vorhergehenden Elements übereinstimmt, wenn n 0 ist, dann Es bedeutet effektiv, dass das Match optional ist.

\. wird mit dem Dezimalpunkt übereinstimmen, es ist als escaped as. ist ein reserviertes Zeichen im regulären Ausdruck, der mit einem beliebigen Zeichen übereinstimmt

(...) bringt den regulären Ausdruck, der darin enthalten ist, als Gruppe zusammen, es gibt andere Konsequenzen, aber ich überlasse das Ihnen zu erforschen.In diesem Fall ist es nur für das nächste Zeichen im regulären Ausdruck vorhanden

? entspricht 0 oder 1 des vorhergehenden Elements (in diesem Fall die Gruppe, die nach einem Dezimalpunkt und bis zu 2 Dezimalzeichen sucht, also erwarten wir, dass es keine Dezimalstelle mit nachfolgenden Zeichen (0 Auftreten) oder einen Dezimalpunkt mit bis zu 2 Dezimalzeichen (1 Auftreten) gibt)

$ passt das Ende der Zeichenfolge, es kann keine Zeichen in der String nach diesem Punkt.

+0

stimmt nicht mit dem letzten Beispiel von OP überein – Amarghosh

+0

@Amarghosh, geändert. – Lazarus

Verwandte Themen