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]+$
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]+$
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 per il "metodo integrato" paragrafo – niko
Il downvoter si prenderà cura di condividere? –
Sembra che abbiamo un troll intorno a queste parti. Anch'io ho downvoted. –
Questo potrebbe funzionare:
^(?:\d*\.)?\d+$
Ciò richiede un punto decimale. –
Sì, sto facendo corrispondere \ d * tra parentesi, non \ d + – niko
Sembra OK ora. Ho commentato prima di aggiungere il '?'. –
Il seguente dovrebbe funzionare:
^(?!.*\..*\.)[.\d]+$
Questo utilizza un lookahead negativo per assicurarsi che ci sono meno di due .
caratteri della stringa.
Questo attraversa la stringa due volte, però. –
Perché vorresti renderlo così complicato? –
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! –
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?
Sembra a mio agio, avere un upvote. –
* raggiunge l'handshake * –
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:
7
fabbrica 77
fabbrica .77
fabbrica 0.77
fabbrica 0.
non funziona .77
funziona 77
opere ..77
non funziona .77
opere 0.77
lavori 0077.77
funziona 0077
funzionaNon utilizzando look-aheads e look-sederi ha il vantaggio di non doversi preoccupare di attacchi DOS RegEx-based.
HTH
La migliore risposta, piuttosto di un articolo di ricerca è qui: https://stackoverflow.com/a/39399503/715269 – Gangnus