¿Cuál es la expresión regular para "Cualquier entero positivo, excluyendo 0"?

91

¿Cómo se ^\d+$puede mejorar para no permitir 0?

EDITAR (hacerlo más concreto):

Ejemplos para permitir:
1
30
111
Ejemplos Para no permitir:
0
00
-22

No importa si se permiten o no números positivos con un cero inicial (p 022. Ej .).

Esto es para la implementación de Java JDK Regex.

Zeemee
fuente
2
¿Quieres aceptar, por ejemplo 076,?
Karl Knechtel - fuera de casa el
@Karl Knechtel: Pero puedo sacrificar esta función en aras de la simplicidad.
Zeemee
3
“Cualquier entero positivo, excluyendo 0” tenga en cuenta que 0 no es un entero positivo.
SK9

Respuestas:

176

Prueba esto:

^[1-9]\d*$

... y algo de relleno para superar el límite de respuesta de 30 caracteres SO :-).

Aquí está la demostración

Tomasz Nurkiewicz
fuente
Solo por curiosidad, ¿por qué necesitamos \ d + al final? ¿Por qué no ^[1-9]+$funcionaría?
mtahmed
18
@mtahmed: ^[1-9]+$no permitiría 10
Lie Ryan
1
Permitirá 1. "\ d *" también coincide con la cadena vacía.
Daniel
@mtahmed ^[1-9]+$no lo permitiría 10. @Mulmoth la sugerencia lo permitirá 1, ya que \d*coincide cero o más veces. Sin embargo, no lo permitirá 076, ya que no comienza con un [1-9].
Karl Knechtel - fuera de casa el
2
¿Pero de qué 01?
Museful
71

Lamento llegar tarde, pero el OP quiere permitir, 076pero probablemente NO quiera permitir 0000000000.

Entonces, en este caso, queremos una cadena de uno o más dígitos que contenga al menos uno distinto de cero . Es decir

^[0-9]*[1-9][0-9]*$
Ray Toal
fuente
Esto parece cumplir con lo que quería el OP
Abdul
Quiero un entero positivo y un decimal positivo. tienes alguna solucion?
Debería hacer eso como una nueva pregunta en lugar de un comentario. Pero spoiler: ^[0-9]*[1-9][0-9]*(\.[0-9]+)$pero eso es hacer una suposición sobre lo que quieres decir con "decimal". ¿Necesitas partes de exponentes? Esto es bastante complicado, así que haz otra pregunta.
Ray Toal
1
+1 por considerar caso de esquina! Por cierto, este patrón funcionará exactamente igual: ^0*[1-9]\d*$ya que el primero [0-9]*está activo solo hasta que [1-9]encuentra el primero que no sea cero, es decir, está activo solo hasta que haya ceros iniciales ( 0*).
mg007
1
Esta es la respuesta correcta. Acepta 00098, que es el comportamiento correcto según la pregunta.
Varun Sharma
20

Puede intentar una afirmación anticipada negativa:

^(?!0+$)\d+$
Karl Knechtel - lejos de casa
fuente
30
Dios mío, tengo miedo.
Daniel
1
Esto permite 01, 02, etc…
Matijs
12

Pruebe este, este funciona mejor para satisfacer los requisitos.

[1-9][0-9]*

Aquí está la salida de muestra

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
Palash Kanti Kundu
fuente
2
Gracias, pero no agrega ningún valor o elegancia en comparación con la respuesta aceptada [1-9]\d*.
Zeemee
1
@Zeemee que no es correcto ya que \ d podría incluir números que no sean 0-9. Por ejemplo, números arábigos como واحد en algunas bibliotecas.
dummyDev
@dummyDev No estaba al tanto de eso. ¡Gracias por mencionar!
Zeemee
Lamentablemente, esto volverá a ser verdadero para "123abcd".
Charith Jayasanka
Charith Jayasanka - sí, todavía necesita un ^ al principio y un "$" al final :-)
Steve Baroti
7

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

esto puede incluir todos los valores positivos, incluso si está rellenado con cero en la parte delantera

Permite

1

01

10

11 etc.

No permitir

0

00

000 etc.

manoj
fuente
3

Cualquier entero positivo, excluyendo 0: ^\+?[1-9]\d*$
Cualquier entero positivo, incluido 0:^(0|\+?[1-9]\d*)$

usuario11856357
fuente
2

Tengo este:

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

¿Alguien lo supera? :)

Zeemee
fuente
3
Esto permitiría 00¿Quieres esto? Y permitirá 1aaaaay abcd01. ^pertenece solo a la primera alternativa y $solo a la segunda, para resolver esto, coloque corchetes alrededor^([1-9]|[0-9]{2,})$
stema
Bueno, esto acepta 000000000. Dijiste cualquier número entero excluyendo cero .
Ray Toal
2

Solo por diversión, otra alternativa usando lookaheads:

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

Todos los dígitos que desee, pero al menos uno debe ser [1-9].

porges
fuente
2

Es posible que desee esto (editar: permitir el número del formulario 0123):

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

sin embargo, si fuera yo, en su lugar haría

int x = Integer.parseInt(s)
if (x > 0) {...}
Mentira Ryan
fuente
1
Dos problemas: esto también coincide con "123abc" y devuelve 123, y esto podría generar una ParseException.
Daniel
@Daniel: Supongo que esto podría usarse dentro de un esquema de análisis más grande, por lo tanto, tendría una expresión regular / BNF que captura solo dígitos y un código java para verificar que los dígitos capturados sean positivos distintos de cero.
Lie Ryan
@Daniel: en cualquier caso, aún necesitaría los datos como un número entero y, por lo tanto, tarde o temprano aún necesitaría llamar a parseInt () o lanzar su propio parseInt ().
Lie Ryan
@Daniel: en Integer.parseInt()sí mismo agrega muy poca sobrecarga. Lo que es caro es lanzar y capturar excepciones.
Alan Moore
@Lie: ¿cuál es el problema con los \\+?prefijos? Supongo que se supone que es un signo más de escape como aparecería en el código fuente de Java, pero ¿por qué? Si no se permiten los signos menos, creo que es seguro asumir que los signos más también están desactivados.
Alan Moore
0

Esta expresión regular coincide con cualquier entero positivo de 0:

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

Funciona con dos búsquedas retrospectivas negativas, que buscan un signo menos antes de un número, lo que indica que es un número negativo. También funciona para cualquier número negativo mayor que -9 (por ejemplo, -22).

Alexander Hammans
fuente
0

Mi patrón es complicado, pero cubre exactamente "Cualquier entero positivo, excluyendo 0" (1 - 2147483647, no largo). Es para números decimales y no permite ceros a la izquierda.

^((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]))$
OleksiiMLD
fuente
-2

^ [1-9] * $ es lo más simple que se me ocurre


fuente
Esta expresión regular fallará erróneamente al coincidir con números como 10y 29303. También coincidirá con una cadena vacía.
Entidad Omnipotente
-3

Esto solo debería permitir decimales> 0

^([0-9]\.\d+)|([1-9]\d*\.?\d*)$
usuario259469
fuente