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.

Zeemee
fonte
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

Tomasz Nurkiewicz
fonte
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]*$
Ray Toal
fonte
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
20

Você pode tentar uma afirmação antecipada negativa:

^(?!0+$)\d+$
Karl Knechtel - longe de casa
fonte
30
Oh meu Deus, estou com medo.
Daniel
1
Isso permite 01, 02, etc ...
Matijs
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
Palash Kanti Kundu
fonte
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.

manoj
fonte
3

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

user11856357
fonte
2

Peguei este:

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

Alguém o vence? :)

Zeemee
fonte
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].

porges
fonte
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) {...}
Mentira ryan
fonte
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).

Alexander Hammans
fonte
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]))$
OleksiiMLD
fonte
-2

^ [1-9] * $ é o mais simples que consigo pensar


fonte
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*)$
user259469
fonte