2013-07-25 11 views
5

Das ist, was ich habeJava Regular Expression Dollar entsprechen beträgt

\$?[0-9]+\.*[0-9]* 

Verwendung Aber wenn ich einige Tests tat bemerkte ich, dass Dinge wie

$$$34.00 

als Spiel zurückkehren würde (aber matcher.group()) gibt nur die übereinstimmende Teilzeichenfolge zurück. Ich will es nicht sogar den regulären Ausdruck übergeben, wenn der Benutzer Zeichen mehr als einen Dollar geht, so kann ich dies versucht:

\${1}[0-9]+\.*[0-9]* 

aber dies scheint die gleiche wie die regulären Ausdruck verhalten i zuerst eingegeben haben. Im Moment teste ich das in Java, aber ich plane, es in C++ mit den Boost-Bibliotheken zu verwenden. Aber bitte geben Sie mir diese Lösung hier nicht, weil ich versuche, ohne jemanden zu lernen, der mir die Antwort gibt.

aber ich Hilfe braucht es, damit der Benutzer machen kann immer nur ein Dollarzeichen eingeben (das, was ich dachte, ist \${1} tun würde)

+0

Würde es nicht auch eine Reihe von Perioden in Folge zulassen? –

+0

können Sie den Anfang und das Ende eines Strings wie^\ $ {1} [0-9] + \. * [0-9] * $ –

+0

angeben Ist die Menge der gesamte String? Wie passen Sie es derzeit an? Mit '.find()'? – fge

Antwort

10

Da Sie diese Regex zu lernen, tun ...

^\$(([1-9]\d{0,2}(,\d{3})*)|(([1-9]\d*)?\d))(\.\d\d)?$

Aufteilung:

^\$ Beginn der Zeichenfolge mit $ ein einzelnes Dollarzeichen

([1-9]\d{0,2}(,\d{3})*) 1-3 Ziffern wobei die erste Ziffer nicht 0 ist, gefolgt von 0 oder mehr Vorkommen von ein Komma mit 3 Ziffern

oder

(([1-9]\d*)?\d) 1 oder mehr Stellen, wo die erste Ziffer 0 nur sein kann, wenn es die einzige Ziffer ist

(\.\d\d)?$ mit einem Punkt und zwei Ziffern optional am Ende des Strings

Spiele:

$4,098.09 
$4098.09 
$0.35 
$0 
$380 

Does nicht überein:

$098.09 
$0.9 
$10,98.09 
$10,980456 
+0

'(([1-9] \ d *)? \ D)' sorgt auch, wenn der Benutzer keine Kommas eingibt, nicht wahr? Ich bin froh, dass Sie diese Antwort gepostet haben, weil ich wirklich viel davon gelernt habe, diesen Regex selbst zu zerlegen und Stück für Stück zu verstehen. – rage

+0

Ja, dieser Teil ist speziell zu erfassen, wenn keine Kommas in der Zeichenfolge verwendet werden. – Syon

1

Sie fehlen ^ (Anfang string), $ (Ende string)

^\$\d+([.][0-9]+)?$ 
2

Sie können etwas wie [^\$]*\$? am Anfang tun. Dies würde sicherstellen, dass es keine doppelten $ -Zeichen gibt, sondern auch übereinstimmen, wenn kein $ vorhanden ist.

Auch, wenn Sie mit Währung (möglich dezimal und 2 Stellen nach) arbeiten, sollten Sie [\.\d{2}]?.

Dies sagt verwenden, dass es ein Spiel sein kann, wenn es durch eine Instanz einer Periode und zwei Ziffern gefolgt wird oder gar nichts. Wie in den Kommentaren erwähnt, ist es auch mehrere Perioden in einer Reihe passen können, so sollten Sie die * quantifier nach \.

+0

einzugeben. Ich wollte den Benutzer nicht zwingen, Cents hinzuzufügen, wenn er es nicht brauchte. . Würde '\. {0,1} 'dafür arbeiten? – rage

+0

'\.?' Ist das selbe wie '\. {0,1}'. Der '?' Quantor bedeutet, dass es entweder einmal oder gar nicht passiert. Sie sollten auch die zwei möglichen Cent-Ziffern nach dem Zeitraum einfügen, wie ich in meiner Antwort gezeigt habe. Ohne sie würde "$ 27.50" nur "$ 27" entsprechen. –

17

Ich würde nicht verwenden schlagen die Verwendung von regulären Ausdrücken für die Währungs Parsing zu vermeiden, besonders wenn Java bietet Ihnen viel einfachere Möglichkeiten, dieses Problem zu lösen.

Betrachten Sie diesen Code:

String str = "$789.11"; // user entered value 
Number number = null; 
try { 
    number = NumberFormat.getCurrencyInstance(Locale.US).parse(str); 
} catch(ParseException pe) { 
    // ignore 
} 

if (number != null) { 
    // proceed as user entered a good value 
} 
else { 
    // user didn't enter a good value 
} 
+2

Schande, dass ich nicht öfter +1 geben kann – sjr

+1

Das ist ziemlich ordentlich und ich werde es definitiv in meiner Toolbox speichern, aber ich versuche, reguläre Ausdrücke zu lernen Deshalb habe ich versucht, eine Lösung für dieses Problem zu finden. – rage

+0

Ja sicher, es ist dein Vorrecht. Wenn Sie jedoch wissen möchten, dass die Währungszeichenfolge auch Komma enthalten kann, z. '$ 23,456.78' – anubhava

0

ich weiß, das spät kommt, aber dies scheint für mich

zu arbeiten 0
(\$)?[0-9]+\.*[0-9]* 

ich verstehe nicht, warum es nicht für Sie arbeitete.

0

[$](([1-9]+\.?\d*)|([0]\.\d*)|[0]) Muster ideal für diesen Fall.

Dies ist Standard Perl Regex, könnte aber in JAVA mit einigen Bibliotheken verwendet werden.