Valores decimais ou numéricos na validação de expressão regular

Eu estou tentando usar uma validação de expressão regular para verificar apenas valores decimais ou valores numéricos. Mas o usuário insere um valor numérico, não é o primeiro dígito “0”

Como faço isso?

Um dígito no intervalo de 1 a 9 seguido por zero ou mais outros dígitos:

^[1-9]\d*$ 

Para permitir números com um ponto decimal opcional seguido por dígitos. Um dígito no intervalo de 1 a 9 seguido por zero ou mais outros dígitos, seguido opcionalmente por um ponto decimal seguido por pelo menos 1 dígito:

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

Notas:

  • O ^ e $ âncora para o início e fim, basicamente, dizendo que a cadeia inteira deve corresponder ao padrão

  • ()? corresponde a 0 ou 1 da coisa toda entre os parênteses

Atualizar para lidar com vírgulas:

Em expressões regulares tem um significado especial – corresponde a qualquer caractere único. Para corresponder literalmente a . em uma corda você precisa escaping do . usando \. Este é o significado do \. na regexp acima. Então, se você quiser usar vírgula, o padrão é simplesmente:

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

Atualização adicional para lidar com vírgulas e pontos finais

Se você quiser permitir um . entre grupos de dígitos e a , entre as partes integral e fracionária, tente:

 ^[1-9]\d{0,2}(\.\d{3})*(,\d+)?$ 

ou seja, este é um dígito no intervalo de 1 a 9 seguido por até 2 outros dígitos, em seguida, zero ou mais grupos de um ponto final seguido por 3 dígitos, em seguida, opcionalmente, sua vírgula e dígitos como antes.

Se você quiser permitir um . em qualquer lugar entre os dígitos, tente:

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

ou seja, um dígito 1-9 seguido por zero ou mais dígitos ou pontos finais, opcionalmente seguido por uma vírgula e um ou mais dígitos.

Na verdade, nenhuma das respostas dadas cobrem totalmente o pedido.
Como o OP não forneceu um caso de uso específico ou tipos de números, tentarei cobrir todos os casos e permutações possíveis.

Números regulares

Positivo Total

Esse número geralmente é chamado de inteiro não assinado , mas você também pode chamá-lo de número não fracionário positivo, include zero. Isso inclui números como 0 , 1 e 99999 .
A expressão regular que cobre essa validação é:

 /^(0|[1-9]\d*)$/ 

Teste este regex

Total Positivo e Negativo

Esse número geralmente é chamado inteiro com sinal , mas também é possível chamá-lo de um número não fracionário. Isso inclui números como 0 , 1 , 99999 , -99999 , -1 e -0 .
A expressão regular que cobre essa validação é:

 /^-?(0|[1-9]\d*)$/ 

Teste este regex

Como você provavelmente percebeu, incluí também -0 como um número válido. Mas, alguns podem argumentar com esse uso, e dizer que este não é um número real (você pode ler mais sobre o Signed Zero aqui ). Então, se você quiser excluir esse número dessa regex, aqui está o que você deve usar:

 /^-?(0|[1-9]\d*)(? 

Teste este regex

Tudo que eu adicionei é (? , o que significa não include -0 antes desta afirmação. Essa afirmação (? chamou lookbehind negativo , o que significa que qualquer frase substitui o ... não deve aparecer antes desta afirmação. Lookbehind tem limitações, como a frase não pode include quantificadores. É por isso que, em alguns casos, vou usar o Lookahead, que é o mesmo, mas no sentido oposto.

Muitos sabores regex, incluindo os usados ​​por Perl e Python, permitem somente cadeias de comprimento fixo. Você pode usar texto literal, escape de caractere, escape Unicode diferente de \X e classs de caractere. Você não pode usar quantificadores ou referências anteriores. Você pode usar a alternância, mas somente se todas as alternativas tiverem o mesmo tamanho. Esses sabores avaliam lookbehind primeiro percorrendo a cadeia de assunto com o mesmo número de caracteres que as necessidades de lookbehind e, em seguida, tentando a regex dentro do lookbehind da esquerda para a direita.

Você pode ler mais sobre asserções de Lookaround aqui .

Números fracionários

Positivo

Esse número geralmente é chamado de float não assinado ou duplo não assinado , mas também é possível chamá-lo de número fracionário positivo, include zero. Isso inclui números como 0 , 1 , 0.0 , 0.1 , 1.0 , 99999.000001 , 5.10 .
A expressão regular que cobre essa validação é:

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

Teste este regex

Alguns podem dizer que números como .1 , .0 e .00651 (o mesmo que 0.1 , 0.0 e 0.00651 respectivamente) também são números fracionais válidos, e eu não posso discordar deles. Então aqui está uma regex que também suporta este formato:

 /^(0|[1-9]\d*)?(\.\d+)?(?<=\d)$/ 

Teste este regex

Negativo e Positivo

Esse número geralmente é chamado de float assinado ou duplo assinado , mas também é possível chamá-lo de um número fracionário. Isso inclui números como 0 , 1 , 0.0 , 0.1 , 1.0 , 99999.000001 , 5.10 , -0 , -1 , -0.0 , -0.1 , -99999.000001 , 5.10 .
A expressão regular que cobre essa validação é:

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

Teste este regex

Para não-crentes:

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

Teste este regex

Para aqueles que querem suportar também as representações de zero invisíveis, como .1 , -.1 , use o seguinte regex:

 /^-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)$/ 

Teste este regex

A combinação de não-crentes e crentes nulos invisíveis, use este regex:

 /^(?!-0?(\.0+)?$)-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)$/ 

Teste este regex

Números com notação científica (notação exponencial AKA)

Alguns podem querer apoiar em suas validações, números com um caráter científico e , que é a propósito, um número absolutamente válido, é criado para representar em breve um número muito longo. Você pode ler mais sobre Notação Científica aqui . Estes números são geralmente semelhantes a 1e3 (que é 1000 ), 1e-3 (que é 0,001) e são totalmente suportados por muitas das principais linguagens de programação (por exemplo, JavaScript). Você pode testá-lo, verificando se a expressão '1e3'==1000 retorna true .
Eu dividirei o suporte para todas as seções acima, incluindo números com notação científica.

Números regulares

Validação de regex de número inteiro positivo, suporta números como 6e4 , 16e-10 , 0e0 , mas também números regulares como 0 , 11 :

 /^(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i 

Teste este regex

Validação de regex de número inteiro positivo e negativo, suporta números como -6e4 , -16e-10 , -0e0 mas também números regulares como -0 , -11 e todos os números positivos acima:

 /^-?(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i 

Teste este regex

Validação de regex de número inteiro positivo e negativo para não- -0 crentes, o mesmo que o acima, exceto que agora ele proíbe números como -0 , -0e0 , -0e5 e -0e-6 :

 /^(?!-0)-?(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i 

Teste este regex

Números fracionários

Validação de regex de número positivo, suporta também os números inteiros acima, além de números como 0.1e3 , 56.0e-3 , 0.0e10 e 1.010e0 :

 /^(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?$/i 

Teste este regex

Número positivo com validação de regex de suporte a zero invisível, suporta também os números positivos acima, além de números como .1e3 , .0e0 , .0e-5 e .1e-7 :

 /^(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?$/i 

Teste este regex

Validação de regex de número negativo e positivo, suporta os números positivos acima, mas também números como -0e3 , -0.1e0 , -56.0e-3 e -0.0e10 :

 /^-?(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?$/i 

Teste este regex

Validação de regex numérica negativa e positiva para não- -0 crentes, igual ao acima, exceto que agora proíbe números como -0 , -0.00000 , -0.0e0 , -0.00000e5 e -0e-6 :

 /^(?!-0(\.0+)?(e|$))-?(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?$/i 

Teste este regex

Número negativo e positivo com validação de regex de suporte a zero invisível, suporta também os números positivos e negativos acima, além de números como -.1e3 , -.0e0 , -.0e-5 e -.1e-7 :

 /^-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?$/i 

Teste este regex

Número negativo e positivo com a combinação de crentes não- -0 e crentes invisíveis, iguais aos acima, mas proíbe números como -.0e0 , -.0000e15 e -.0e-19 :

 /^(?!-0?(\.0+)?(e|$))-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?$/i 

Teste este regex

Números com Representação Hexadecimal

Em muitas linguagens de programação, a representação de string de um número hexadecimal como 0x4F7A pode ser facilmente convertida para o número decimal 20346 .
Assim, alguém pode querer apoiá-lo em seu script de validação.
A expressão regular a seguir suporta apenas representações de números hexadecimais:

 /^0x[0-9a-f]+$/i 

Teste este regex

Todas as permutações

Essas Expressões Regulares finais suportam os números zero invisíveis.

Signed Zero Believers

 /^(-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?|0x[0-9a-f]+)$/i 

Teste este regex

Crentes Zero Não Assinados

 /^((?!-0?(\.0+)?(e|$))-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?|0x[0-9a-f]+)$/i 

Teste este regex

Espero ter coberto todas as permutações de números suportadas em muitas linguagens de programação.
Boa sorte!


Ah, esqueci de mencionar que aqueles que querem validar um número incluem um separador de milhar, você deve limpar todas as vírgulas ( , ) primeiro, pois pode haver qualquer tipo de separador por aí, você não pode realmente cobrir todas elas.
Mas você pode removê-los primeiro, antes da validação do número:

 //JavaScript function clearSeparators(number) { return number.replace(/,/g,''); } 

Eu tive o mesmo problema, mas também queria que “.25” fosse um número decimal válido. Aqui está a minha solução usando JavaScript:

 function isNumber(v) { // [0-9]* Zero or more digits between 0 and 9 (This allows .25 to be considered valid.) // ()? Matches 0 or 1 things in the parentheses. (Allows for an optional decimal point) // Decimal point escaped with \. // If a decimal point does exist, it must be followed by 1 or more digits [0-9] // \d and [0-9] are equivalent // ^ and $ anchor the endpoints so tthe whole string must match. return v.trim().length > 0 && v.trim().match(/^[0-9]*(\.[0-9]+)?$/); } 

Onde meu método trim () é

 String.prototype.trim = function() { return this.replace(/(^\s*|\s*$)/g, ""); }; 

Matthew DesVoigne

Eu testei todos os regexes dados, mas infelizmente nenhum deles passou nos testes:

  String []goodNums={"3","-3","0","0.0","1.0","0.1"}; String []badNums={"001","-00.2",".3","3.","a",""," ","-"," -1","--1","-.1","-0", "2..3", "2-", "2...3", "2.4.3", "5-6-7"}; 

Aqui está o melhor que eu escrevi que passa todos esses testes:

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

insira a descrição da imagem aqui

Aqui está um excelente regex de trabalho para números. Isso aceita números com vírgulas e decimais.

 /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/ 

Aqui está o meu regex para validar números:

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

Números válidos:

 String []validNumbers={"3","-3","0","0.0","1.0","0.1","0.0001","-555","94549870965"}; 

Números inválidos:

 String []invalidNumbers={"a",""," ","-","001","-00.2","000.5",".3","3."," -1","--1","-.1","-0"}; 

Experimente este código, espero que ele te ajude

 String regex = "(\\d+)(\\.)?(\\d+)?"; for integer and decimal like 232 232.12 

/([0-9]+[.,]*)+/ corresponde a qualquer número com ou sem coma ou pontos

pode combinar

  122 122,354 122.88 112,262,123.7678 

bug: também corresponde a 262.4377.3883 (mas não importa parcticamente)

Se você precisa validar decimal com pontos, vírgulas, pontos positivos e negativos tente isto:

 Object testObject = "-1.5"; boolean isDecimal = Pattern.matches("^[\\+\\-]{0,1}[0-9]+[\\.\\,]{1}[0-9]+$", (CharSequence) testObject); 

Boa sorte.

Abaixo está o perfeito para o requisito mencionado:

 ^[0-9]{1,3}(,[0-9]{3})*(([\\.,]{1}[0-9]*)|())$