Qual è la regex per "Qualsiasi numero intero positivo, escluso 0"


91

Come può ^\d+$essere migliorato per non consentire 0?

MODIFICA (rendilo più concreto):

Esempi per consentire:
1
30
111
Esempi Per non permettere:
0
00
-22

Non importa se i numeri positivi con uno zero iniziale sono consentiti o meno (ad esempio 022).

Questo è per l'implementazione di Java JDK Regex.


2
Vuoi accettare, ad esempio 076,?
Karl Knechtel - fuori casa

@Karl Knechtel: Ma posso sacrificare questa funzione per motivi di semplicità.
Zeemee

3
"Qualsiasi numero intero positivo, escluso 0" nota che 0 non è un numero intero positivo.
SK9

Risposte:


176

Prova questo:

^[1-9]\d*$

... e un po 'di riempimento per superare il limite di risposta SO di 30 caratteri :-).

Ecco Demo


Solo per curiosità, perché abbiamo bisogno di \ d + alla fine? Perché non ^[1-9]+$funzionerebbe?
mtahmed

18
@mtahmed: ^[1-9]+$non consentirebbe 10
Menzogna Ryan

1
Consentirà 1. "\ d *" corrisponde anche alla stringa vuota.
Daniel

@mtahmed ^[1-9]+$non consentirebbe 10. @Mulmoth il suggerimento lo consentirà 1, poiché \d*corrisponde a zero o più volte. Tuttavia, non consentirà 076, poiché non inizia con un file [1-9].
Karl Knechtel - fuori casa

2
Ma di cosa 01?
Museful

71

Mi dispiace arrivare in ritardo ma l'OP vuole consentire 076ma probabilmente NON vuole consentire 0000000000.

Quindi in questo caso vogliamo una stringa di una o più cifre che contengano almeno una cifra diversa da zero . Questo è

^[0-9]*[1-9][0-9]*$

Questo sembra soddisfare ciò che voleva l'OP
Abdul

voglio un numero intero positivo e un decimale positivo. hai qualche soluzione?

Dovresti chiederlo come nuova domanda piuttosto che come commento. Ma spoiler: ^[0-9]*[1-9][0-9]*(\.[0-9]+)$ma questo è fare un'ipotesi su cosa intendi per "decimale". Hai bisogno di parti esponenti? Questo è piuttosto complicato, quindi fai un'altra domanda.
Ray Toal

1
+1 per considerare il caso d'angolo! BTW questo modello funzionerà esattamente allo stesso modo: ^0*[1-9]\d*$poiché il primo [0-9]*è attivo solo fino a quando non [1-9]trova il primo diverso da zero, cioè è attivo solo fino a quando non ci sono zeri iniziali ( 0*).
mg007

1
Questa è la risposta esatta. Accetta 00098 che è il comportamento corretto come da domanda.
Varun Sharma


12

Prova questo, questo funziona meglio per soddisfare il requisito.

[1-9][0-9]*

Ecco l'output di esempio

String 0 matches regex: false
String 1 matches regex: true
String 2 matches regex: true
String 3 matches regex: true
String 4 matches regex: true
String 5 matches regex: true
String 6 matches regex: true
String 7 matches regex: true
String 8 matches regex: true
String 9 matches regex: true
String 10 matches regex: true
String 11 matches regex: true
String 12 matches regex: true
String 13 matches regex: true
String 14 matches regex: true
String 15 matches regex: true
String 16 matches regex: true
String 999 matches regex: true
String 2654 matches regex: true
String 25633 matches regex: true
String 254444 matches regex: true
String 0.1 matches regex: false
String 0.2 matches regex: false
String 0.3 matches regex: false
String -1 matches regex: false
String -2 matches regex: false
String -5 matches regex: false
String -6 matches regex: false
String -6.8 matches regex: false
String -9 matches regex: false
String -54 matches regex: false
String -29 matches regex: false
String 1000 matches regex: true
String 100000 matches regex: true

2
Grazie, ma non aggiunge alcun valore o eleganza rispetto alla risposta accettata [1-9]\d*.
Zeemee

1
@Zeemee che non è corretto poiché \ d potrebbe includere numeri diversi da 0 a 9. Ad esempio numeri arabi come واحد in alcune biblioteche.
dummyDev

@dummyDev non ne ero a conoscenza. Grazie per averlo menzionato!
Zeemee

Purtroppo questo tornerà vero per "123abcd".
Charith Jayasanka

Charith Jayasanka - sì, serve ancora un ^ all'inizio e un "$" alla fine :-)
Steve Baroti

7

^\d*[1-9]\d*$

questo può includere tutti i valori positivi, anche se è riempito da Zero nella parte anteriore

Permette

1

01

10

11 ecc

non permettere

0

00

000 ecc ..


3

Qualsiasi numero intero positivo, escluso 0: ^\+?[1-9]\d*$
Qualsiasi numero intero positivo, incluso 0:^(0|\+?[1-9]\d*)$


2

Ho questo:

^[1-9]|[0-9]{2,}$

Qualcuno lo batte? :)


3
Ciò consentirebbe 00Vuoi questo? E permetterà 1aaaaae abcd01. ^appartiene solo alla prima alternativa e $solo alla seconda, per risolvere questo problema metterci delle parentesi intorno^([1-9]|[0-9]{2,})$
stema

Bene, questo accetta 000000000. Hai detto qualsiasi numero intero escluso zero .
Ray Toal

2

Solo per divertimento, un'altra alternativa usando i lookahead:

^(?=\d*[1-9])\d+$

Tutte le cifre che vuoi, ma almeno una deve essere [1-9].


2

Potresti volerlo (modifica: consenti il ​​numero del modulo 0123):

^\\+?[1-9]$|^\\+?\d+$

tuttavia, se fossi io, lo farei invece

int x = Integer.parseInt(s)
if (x > 0) {...}

1
Due problemi: questo corrisponde anche a "123abc" e restituisce 123, e questo potrebbe generare una ParseException.
Daniel

@ Daniel: Immagino che questo potrebbe essere usato all'interno di uno schema di analisi più ampio, quindi avresti una regex / BNF che cattura solo cifre e un codice java per verificare che le cifre catturate siano positive diverse da zero.
Lie Ryan

@Daniel: in ogni caso, avresti comunque bisogno dei dati come numero intero e quindi prima o poi dovresti ancora chiamare parseInt () o lanciare il tuo parseInt ().
Lie Ryan

@ Daniel: Integer.parseInt()essa stessa aggiunge pochissime spese generali. È il lancio e la cattura di eccezioni che è costoso.
Alan Moore

@Lie: qual è il problema con i \\+?prefissi? Immagino che dovrebbe essere un segno più di escape come apparirebbe nel codice sorgente Java, ma perché? Se i segni meno non sono ammessi, penso che sia lecito ritenere che anche i segni più siano fuori.
Alan Moore

0

Questa RegEx corrisponde a qualsiasi numero intero positivo su 0:

(?<!-)(?<!\d)[1-9][0-9]*

Funziona con due lookbehind negativi, che cercano un segno meno prima di un numero, che indica che si tratta di un numero negativo. Funziona anche per qualsiasi numero negativo maggiore di -9 (es. -22).


0

Il mio schema è complicato, ma copre esattamente "Qualsiasi numero intero positivo, escluso 0" (1 - 2147483647, non lungo). È per i numeri decimali e non consente gli zeri iniziali.

^((1?[1-9][0-9]{0,8})|20[0-9]{8}|(21[0-3][0-9]{7})|(214[0-6][0-9]{6})
|(2147[0-3][0-9]{5})|(21474[0-7][0-9]{4})|(214748[0-2][0-9]{3})
|(2147483[0-5][0-9]{2})|(21474836[0-3][0-9])|(214748364[0-7]))$

-2

^ [1-9] * $ è il più semplice a cui riesco a pensare


Questa espressione regolare non riuscirà erroneamente a trovare la corrispondenza con numeri come 10e 29303. Corrisponderà anche a una stringa vuota.
OnnipotentEntity

-3

Questo dovrebbe consentire solo i decimali> 0

^([0-9]\.\d+)|([1-9]\d*\.?\d*)$
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.