2012-06-06 22 views
7

ho bisogno di un'espressione regex che abbinerà il seguente:numeri corrispondenti Regex e decimali

.5 
0.5 
1.5 
1234 

ma NON

0.5.5 
absnd (any letter character or space) 

Ho questo che soddisfa tutti, ma 0.5.5

^[.?\d]+$ 
+0

La migliore risposta, piuttosto di un articolo di ricerca è qui: https://stackoverflow.com/a/39399503/715269 – Gangnus

risposta

18

Questo è un compito abbastanza comune. Il modo più semplice che conosco a che fare con esso è questo:

^[+-]?(\d*\.)?\d+$ 

Ci sono anche altre complicazioni, come ad esempio se si desidera consentire zeri o virgole o cose del genere che porta. Questo può essere complicato come vuoi che sia. Ad esempio, se si desidera consentire il formato 1,234,567.89, si può andare con questo:

^[+-]?(\d*|\d{1,3}(,\d{3})*)(\.\d+)?\b$ 

Che \b c'è una pausa parola, ma sto usando come un modo subdolo per richiedere almeno una cifra a la fine della stringa. In questo modo, una stringa vuota o un singolo + non corrispondono.

Tuttavia, si noti che le espressioni regolari non sono il modo ideale per analizzare stringhe numeriche. Tutti i linguaggi di programmazione moderni che conosco hanno metodi veloci, semplici e incorporati per farlo.

+1

+1 per il "metodo integrato" paragrafo – niko

+0

Il downvoter si prenderà cura di condividere? –

+0

Sembra che abbiamo un troll intorno a queste parti. Anch'io ho downvoted. –

1

Questo potrebbe funzionare:

^(?:\d*\.)?\d+$ 
+1

Ciò richiede un punto decimale. –

+0

Sì, sto facendo corrispondere \ d * tra parentesi, non \ d + – niko

+0

Sembra OK ora. Ho commentato prima di aggiungere il '?'. –

3

Il seguente dovrebbe funzionare:

^(?!.*\..*\.)[.\d]+$ 

Questo utilizza un lookahead negativo per assicurarsi che ci sono meno di due . caratteri della stringa.

http://www.rubular.com/r/N3jl1ifJDX

+0

Questo attraversa la stringa due volte, però. –

+0

Perché vorresti renderlo così complicato? –

+3

Tyler e Justin - Sono d'accordo sul fatto che il tuo metodo sia migliore, ma lascerò questo come alternativa. Il metodo lookahead è bello per controllare più condizioni come questa (ad esempio nella convalida della password), ma complica qualcosa di semplice come questo, goditi un +1! –

10

Nessuno sembra essere la contabilità per i numeri negativi. Inoltre, alcuni stanno creando un gruppo di acquisizione che non è necessario. Questa è la soluzione più completa IMO.

^[+-]?(?:\d*\.)?\d+$ 

MODIFICA: Perché il downvote?

+0

Sembra a mio agio, avere un upvote. –

+2

* raggiunge l'handshake * –

2

Ecco una soluzione molto più semplice che non utilizza qualsiasi look-aheads o look-behinds:

^\d*\.?\d+$ 

Per capire chiaramente perché questo funziona, letto da destra a sinistra:

  • Alla fine è richiesta almeno una cifra.
    7 fabbrica
    77 fabbrica
    .77 fabbrica
    0.77 fabbrica
    0. non funziona
    stringa vuota non funziona
  • Un singolo periodo precedente la cifra è facoltativa .
    .77 funziona
    77 opere
    ..77 non funziona
  • Qualsiasi numero di cifre precedenti il ​​periodo (opzionale). .77 opere
    0.77 lavori
    0077.77 funziona
    0077 funziona

Non utilizzando look-aheads e look-sederi ha il vantaggio di non doversi preoccupare di attacchi DOS RegEx-based.

HTH

Problemi correlati