Qual é a regex para “Qualquer número inteiro positivo, excluindo 0”


91

Como pode ^\d+$ser melhorado para não permitir 0?

EDITAR (tornar mais concreto):

Exemplos para permitir:
1
30
111
Exemplos para não permitir:
0
00
-22

Não importa se os números positivos com um zero à esquerda são permitidos ou não (por exemplo 022).

Isso é para implementação Java JDK Regex.


2
Você deseja aceitar, por exemplo 076,?
Karl Knechtel - longe de casa

@Karl Knechtel: Mas posso sacrificar esse recurso por uma questão de simplicidade.
Zeemee de

3
“Qualquer número inteiro positivo, excluindo 0” observe que 0 não é um número inteiro positivo.
SK9,

Respostas:


176

Experimente isto:

^[1-9]\d*$

... e algum preenchimento para exceder o limite de resposta de SO de 30 caracteres :-).

Aqui está a demonstração


Só por curiosidade, por que precisamos de \ d + no final? Por que não ^[1-9]+$funcionaria?
mtahmed de

18
@mtahmed: ^[1-9]+$não permitiria 10
Mentira Ryan

1
Isso permitirá 1. "\ d *" também corresponde à string vazia.
Daniel

@mtahmed ^[1-9]+$não permitiria 10. @Mulmoth a sugestão permitirá 1, pois \d*corresponde a zero ou mais vezes. No entanto, não permitirá 076, pois isso não começa com a [1-9].
Karl Knechtel - longe de casa

2
Mas e quanto 01?
Museful

71

Desculpe chegar atrasado, mas o OP deseja permitir, 076mas provavelmente NÃO deseja permitir 0000000000.

Portanto, neste caso, queremos uma string de um ou mais dígitos contendo pelo menos um diferente de zero . Isso é

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

Isso parece cumprir o que o OP queria
Abdul

eu quero inteiro positivo e decimal positivo. você tem alguma solução?

Você deve fazer isso como uma nova pergunta, e não como um comentário. Mas spoiler: ^[0-9]*[1-9][0-9]*(\.[0-9]+)$mas isso é fazer uma suposição sobre o que você entende por "decimal". Você precisa de peças expoentes? Isso é muito complicado, então faça outra pergunta.
Ray Toal

1
1 por considerar o caso de canto! BTW, este padrão funcionará exatamente da mesma forma: ^0*[1-9]\d*$uma vez que o primeiro [0-9]*está ativo apenas até [1-9]encontrar o primeiro diferente de zero, ou seja, ele está ativo apenas até que haja zeros iniciais ( 0*).
mg007

1
Esta é a resposta certa. Aceita 00098, que é o comportamento correto de acordo com a pergunta.
Varun Sharma


12

Tente este, este funciona melhor para atender aos requisitos.

[1-9][0-9]*

Aqui está o exemplo de saída

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
Obrigado, mas não agrega nenhum valor ou elegância quando comparado à resposta aceita [1-9]\d*.
Zeemee

1
@Zeemee que não está correto, pois \ d pode incluir numerais que não são 0-9. Por exemplo, numerais arábicos como واحد em algumas bibliotecas.
dummyDev

@dummyDev Eu não sabia disso. Obrigado por mencionar!
Zeemee

Infelizmente, isso retornará verdadeiro para "123abcd".
Charith Jayasanka

Charith Jayasanka - sim, ainda precisa de um ^ no início e um "$" no final :-)
Steve Baroti

7

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

isso pode incluir todos os valores positivos, mesmo se for preenchido por Zero na frente

Permite

1

01

10

11 etc

não permita

0

00

000 etc.


3

Qualquer número inteiro positivo, excluindo 0: ^\+?[1-9]\d*$
qualquer número inteiro positivo, incluindo 0:^(0|\+?[1-9]\d*)$


2

Peguei este:

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

Alguém o vence? :)


3
Isso permitiria 00Você quer isso? E isso vai permitir 1aaaaae abcd01. ^pertence apenas à primeira alternativa e $apenas à segunda, para resolver isso, coloque colchetes em torno dela^([1-9]|[0-9]{2,})$
estema

Bem, isso aceita 000000000. Você disse qualquer inteiro excluindo zero .
Ray Toal

2

Apenas por diversão, outra alternativa usando lookaheads:

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

Quantos dígitos você quiser, mas pelo menos um deve ter [1-9].


2

Você pode querer isso (editar: permitir número do formulário 0123):

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

no entanto, se fosse eu, eu faria

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

1
Dois problemas: Isso também corresponde a "123abc" e retorna 123, e isso pode lançar uma ParseException.
Daniel

@Daniel: Acho que isso pode ser usado dentro de um esquema de análise maior, portanto, você teria um regex / BNF que captura apenas dígitos e um código java para verificar se os dígitos capturados são positivos diferentes de zero.
Lie Ryan

@Daniel: em qualquer caso, você ainda precisaria dos dados como um inteiro e, portanto, mais cedo ou mais tarde, ainda precisaria chamar parseInt () ou rolar seu próprio parseInt ().
Lie Ryan

@Daniel: em Integer.parseInt()si adiciona muito pouca sobrecarga. É o lançamento e a captura de exceções que é caro.
Alan Moore

@Lie: qual é o problema com os \\+?prefixos? Suponho que seja um sinal de adição de escape, como apareceria no código-fonte Java, mas por quê? Se os sinais de menos não forem permitidos, acho que é seguro presumir que os sinais de mais também estão apagados.
Alan Moore

0

Este RegEx corresponde a qualquer número inteiro positivo de 0:

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

Funciona com dois lookbehinds negativos, que procuram um menos antes de um número, o que indica que é um número negativo. Também funciona para qualquer número negativo maior que -9 (por exemplo, -22).


0

Meu padrão é complicado, mas cobre exatamente "Qualquer número inteiro positivo, excluindo 0" (1 - 2147483647, não longo). É para números decimais e não permite zeros à esquerda.

^((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] * $ é o mais simples que consigo pensar


Esta expressão regular falhará erroneamente ao corresponder a números como 10e 29303. Ele também corresponderá a uma string vazia.
OmnipotentEntity

-3

Isso deve permitir apenas decimais> 0

^([0-9]\.\d+)|([1-9]\d*\.?\d*)$
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.