2014-12-18 4 views
5
^((?=.*[1-9]|0)(?:\d{1,3}))((?=.*\d)(?:\.\d{3})?)*((?=.*\d)(?:\,\d\d){1}?){0,1}$ 

In realtà penso che questa espressione regolare sia molto lunga e potrebbe essere più breve. Il problema è che non sono molto bravo con le espressioni regolari e quindi ti chiedo aiuto.Regex per il numero di valuta, come posso scrivere più breve?

regex online tester http://regexr.com/3a3mk

Le mie regole:

  • A partire da 1, 2 o 3 numeri positivi [1-9] o 0.
  • Aggiunta come molti. (seguito da 3 numeri [0-9]) come vuoi.
  • possibilità di aggiungere un virgola con 2 numeri (come decimali) Risultati

positivo

  • 0,55
  • 1,60
  • 10,70
  • 100,80
  • 1,10
  • 1,000
  • 1.000,20
  • 10,000
  • 10.000,03
  • 100,000
  • 100.000,08
  • 1,000. 000.000
  • 1.000.000.000,10

risultati negativi

  • 0,0
  • 1,1
  • 1.000
  • 1000,000
  • 0,000
  • 0.000,10
  • 1.000,1
  • 1.000,100
  • 1.0,00
  • 1.00,00
  • 1.000,0
  • 012,10
  • 012.123,10
  • un
  • a0
  • 0, un
  • 0, aa
  • 1.a00.00
  • 1.000.a1

[EDIT] Aggiunti altri risultati negativi

+4

Nota a margine: questo è come qualunque domanda circa regex dovrebbe essere simile. –

risposta

2

Modificato:

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

incontri:

^ all'inizio della riga

[1-9] solo un non-zero cifre

[0-9]{0,2} da 0 a 2 cifre

(\.[0-9]{3})* zero o più lotti di un periodo e di 3 cifre

(0 | [1-9][0-9]{0,2}(\.[0-9]{3})*) sia (i) uno zero o (ii) fino a tre cifre (il primo non uno zero) seguito da blocchi di zero o più lotti di un periodo seguito da tre cifre

(,[0-9]{2})? zero o un lotto di una virgola e 2 cifre

$ fine linea

+1

Non copre i suoi primi due esempi positivi: 0 e 0,55 – Mainz007

+0

@ Mainz007. Buon punto Spero risolto ora. – Tony

+0

Sì rimosso il downvote;) – Mainz007

1

Hai ragione, la tua espressione è un po 'troppo lunga. Una versione più breve che funziona con i numeri di esempio e le specifiche ti ha dato sarebbe questo:

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

Spiegazione:

  • (0|\d{1,3}) verifica la presenza di uno 0 o 1 a 3 cifre
  • (\.\d{3})* verifica la presenza di un punto e 3 numeri, ma a causa di * possono anche non esserci nessuno di essi
  • (,\d{2})? ckeck per una virgola e due cifre, ma ancora una volta può apparire una volta o non del tutto.

Spero che ti aiuti!

+2

Anche la tua espressione regolare corrisponde a '000,55', non è sicuro se questo è ciò che l'OP sta cercando ... – sp00m

+0

Grazie. Ma se ho trovato un risultato positivo che dovrebbe essere negativo (anche nella mia versione) 012/012,12 è accettato (a partire da uno 0 non è accettabile) Quindi vado con la risposta di @ sp00m come ha ottenuto che coperto pure! Ancora un pollice in su! – Marcel

+0

Sì, mancava quello ... – Mainz007

8

Il seguente dovrebbe soddisfare le vostre esigenze:

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

Regular expression visualization

visualizzazione di Debuggex

Demo regex101

+1

anche se il tuo copre anche a23,23 ma suppongo che solo le cifre siano spuntate ... – Mainz007

+1

@ Mainz007 Buona cattura! Ho aggiornato, grazie :) – sp00m

+1

BTW: Grazie per aver mostrato Debuggex;) – Mainz007

Problemi correlati