2010-07-07 14 views
6

Qualcuno potrebbe fornirmi l'espressione regolare per i seguenti modelli?Espressione regolare per corrispondere agli importi in dollari

$ 1234

$ 31234,3

$ 1234,56

$ 123456,78

$ .99

mia esigenza è le cifre prima decimale non deve superare i 6 e dopo la virgola non dovrebbe superare le 2 cifre. Mi aiuti per favore. Grazie in anticipo ..

+0

Penso che ci siano collegamenti/alias regex per cifre decimali, quindi tutti questi suggerimenti che contengono [0-9] potrebbero essere sostituiti con quelli. –

+2

È vero e sicuramente degno di nota. Mi piace sempre usare quelli più espliciti se la forma lunga non è molto più delle scorciatoie. Per cose come lo spazio bianco è fastidioso scriverlo per intero, per quelli alfanumerici lo trovo significa che sono più a colpo d'occhio leggibili per le persone meno abituate alla regex (e quindi alle scorciatoie di classe del personaggio). – Chris

+0

Nessun importo in dollari negativo, ad esempio rimborsi? –

risposta

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

(?=.*\d) fa in modo che ci sia almeno una cifra nella stringa. Senza di ciò, la regex ^\$\d{0,6}(\.\d{1,2})?$ corrisponderebbe alla stringa $.

A proposito, il lookahead non deve essere così lungo; anche un semplice (?=.) farebbe, poiché la regex si assicura che i caratteri successivi siano effettivamente validi. Quindi, può essere semplificata per

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

Qual è il vantaggio dell'uso (? =. */D) di over/d {1,6} nella prima cifra decimale? Sento che mi manca qualcosa qui. – Lazarus

+1

@Lazarus '\ d {1,6}' richiede almeno una cifra prima del punto decimale - non corrisponderà a '$ .99' – Amarghosh

+0

Buon punto, bello :) Grazie per quello. – Lazarus

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

dovrai sfuggire a quel punto decimale - ora corrisponderà a qualsiasi cosa. –

+0

Buon punto. Grazie. È incredibile quante volte lo faccio e come non lo noto mai perché ovviamente corrisponde a un punto ... ;-) – Chris

+0

Non dimentichi di scappare anche qualcos'altro? @Hans – Amarghosh

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

Il modello potrebbe essere:

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

Questo non verifica che ci sono tutte le cifre in modo da "$". è una corrispondenza valida e un risultato valido dati i requisiti originali dell'interrogante.

Per spiegare:

^ significa solo corrispondere se non c'è nulla prima della stringa che sto cercando, vale a dire "USD $ 123.45" fallirebbe in questo esempio come il $ (in abbinamento al \$) non è immediatamente dopo l'inizio della stringa.

\$ corrisponde al carattere $, l'uso del backslash() è chiamato escaping e viene utilizzato per consentire di abbinare caratteri riservati (che nel contesto dell'espressione regolare significa qualcosa) $ che significa corrispondere al fine della stringa, ovvero non ci sono caratteri dopo questo punto

\d ogni carattere decimale, cioè 0-9

{n,m} corrisponderanno da n per m istanze dell'elemento precedente, se n è 0, significa in effetti che la partita è facoltativa.

\. corrisponderà al punto decimale, è scappato come. è un carattere riservato nell'espressione regolare che significa che corrisponde a qualsiasi carattere

(...) porta l'espressione regolare contenuta all'interno insieme come un gruppo, ci sono altre conseguenze, ma lascerò che a voi di esplorare.In questo caso è puramente disponibile per il beneficio del carattere successivo nell'espressione regolare

? corrisponderà a 0 o 1 dell'elemento precedente (in questo caso il gruppo che ricerca un punto decimale e fino a 2 caratteri decimali, quindi ci aspettiamo che non esiste un punto decimale con caratteri finali (0 occorrenze) o un punto decimale con fino a 2 caratteri decimali (1 occorrenze))

$ corrisponde alla fine della stringa, non ci possono essere caratteri nel stringa dopo questo punto.

+0

non corrisponde all'ultimo esempio di OP – Amarghosh

+0

@Amarghosh, modificato. – Lazarus

Problemi correlati