Regex apenas para números


309

Não usei expressões regulares, por isso estou tendo dificuldades para solucionar problemas. Quero que a regex corresponda apenas quando a string contida for todos os números; mas com os dois exemplos abaixo, ele corresponde a uma sequência que contém todos os números, além de um sinal de igual como "1234 = 4321". Tenho certeza de que há uma maneira de mudar esse comportamento, mas como eu disse, nunca fiz muito com expressões regulares.

string compare = "1234=4321";
Regex regex = new Regex(@"[\d]");

if (regex.IsMatch(compare))
{ 
    //true
}

regex = new Regex("[0-9]");

if (regex.IsMatch(compare))
{ 
    //true
}

Caso isso importe, estou usando C # e .NET2.0.


6
Você precisa combinar números ou dígitos ? Por exemplo: 123.456 é um número, mas nem todos os dígitos.
Joel Coehoorn

Exatamente, OP não é totalmente claro sobre o uso de números inteiros ou não
Sune Rievers

3
Por que não TryParse a string para esse caso simples? bool decimal.TryParse (string string, fora resultado decimal) ou bool int.TryParse (string string, fora resultado int)
Makach

Veja esta resposta para um tratamento definitivo de análise de números com expressões regulares.
tchrist

1
Em geral, a maneira mais fácil de solucionar problemas de expressões Regex, na minha opinião, é usando um interpretador de linha de comando, se o seu idioma permitir (parece que a maioria faz). Como este exemplo está em C #, é possível usar linqpad.net ou um ponto de interrupção no depurador e, em seguida, usar a janela Immediate in VS como uma CLI.
andrew

Respostas:


478

Use as âncoras inicial e final.

Regex regex = new Regex(@"^\d$");

Use "^\d+$"se precisar corresponder a mais de um dígito.


Observe que "\d"coincidirá com [0-9]outros caracteres de dígito, como os algarismos arábicos orientais ٠١٢٣٤٥٦٧٨٩. Use "^[0-9]+$"para restringir as correspondências apenas aos algarismos arábicos 0 - 9.


Se você precisar incluir outras representações numéricas que não sejam apenas dígitos (como valores decimais para iniciantes), consulte o guia abrangente do @tchrist para analisar números com expressões regulares .


Que tal um número definido de valores numéricos? Isso geralmente acontece com os códigos postais de certos países como a Índia. Eu acho que podemos ter que fazer uma verificação do comprimento da string depois disso?
Najeeb

2
@ Najeeb Sim, como os códigos postais indianos são números de 6 dígitos, você pode usar algo parecido "^\d{6}$". Alguns outros países têm regras mais complicadas para códigos postais, portanto, as soluções regex para vários países também podem ser bastante complicadas. Confira alguns dos exemplos em stackoverflow.com/q/578406/1288
Bill the Lizard

Como é que, se a string de entrada é algo como: "3 a", ela ainda corresponderá? Alguém sabe como eu posso fazê-lo corresponder SOMENTE se houver números e nada mais (exceto um sinal negativo, suponho). Atualmente, eu o tenho configurado assim "-? [0-9] +".
22418 Matthew

105

Sua regex corresponderá a qualquer coisa que contenha um número. Você deseja usar âncoras para corresponder a toda a cadeia e, em seguida, corresponder a um ou mais números:

regex = new Regex("^[0-9]+$");

O ^ancorará o início da sequência, o $final da sequência e +corresponderá a um ou mais do que a precede (um número nesse caso).


38

Se você precisar tolerar o ponto decimal e o marcador de milhar

var regex = new Regex(@"^-?[0-9][0-9,\.]+$");

Você precisará de um "-", se o número puder ser negativo.


@Florin Ghita. Obrigado. "-" precisa estar no começo.
21413 Andy

3
Esse regex também permite erroneamente que o sinal negativo inicial ( -) e o período ( .) ocorram mais de uma vez.
DavidRR

5
você pode fazer -e .opcional via ?. -?\d+(?:\.\d+)?corresponderia a números inteiros ou decimais. (The ?:nos parênteses só faz os parênteses um grupo não-captura e usados para único grupo para maior clareza.)
butterywombat

2
Ele falha em casos extremos como 1, .5, mas se você supervisionar isso. ainda assim, falha em casos básicos como -2. Altere-o para ^-?[0-9][0-9,\.]*$evitar falhas no caso básico. + é substituído por *
PrivateOmega

Um cenário que estou perdendo aqui é a notação de engenharia (1.2345e-4), alguma sugestão sobre isso?
WolfiG

18

É compatível porque está encontrando "uma correspondência", não uma correspondência da cadeia completa. Você pode corrigir isso alterando seu regexp para procurar especificamente o início e o fim da string.

^\d+$

16

Talvez meu método o ajude.

    public static bool IsNumber(string s)
    {
        return s.All(char.IsDigit);
    }

3
Lembre-se de que Char.IsDigitretorna truepara qualquer caractere membro da categoria UnicodeCategory.DecimalDigitNumber . Pode não ser o que o OP deseja. Veja também Por que Char.IsDigit retorna true para caracteres que não podem ser analisados ​​para int? .
DavidRR


16

Isso funciona com números inteiros e decimais. Não corresponde se o número tiver o separador de milhar em coma,

"^-?\\d*(\\.\\d+)?$"

algumas strings que combinam com isso:

894
923.21
76876876
.32
-894
-923.21
-76876876
-.32

algumas strings que não:

hello
9bye
hello9bye
888,323
5,434.3
-8,336.09
87078.

11

^ \ d + $, que é "início da sequência", "1 ou mais dígitos", "final da sequência" em inglês.


10

Se você precisar verificar se todos os dígitos são números (0-9) ou não,

^[0-9]+$

1425 TRUE

0142 TRUE

0 VERDADEIRO

1 VERDADEIRO

154a25 FALSE

1234 = 3254 FALSO


10

Aqui está o meu trabalho:

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

E alguns testes

Testes positivos:

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

Testes negativos:

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

Verificado não apenas em C #, mas também em Java, Javascript e PHP


".3", "3." são realmente bons números (significando 0,3 e 3,0, respectivamente). vemos isso o tempo todo nos sistemas de origem e a maioria das funções de to_number (xx) dos idiomas que você mencionou os reconhecerá e os converterá corretamente. obrigado.
Tag

1
@Ruslan, você está certo em muitos sistemas ".3", "3". analisaria o número válido e seria usado como você mencionou "0,3" e "3,0". Mas, por outro lado - esse é o valor convertido , portanto, o valor original ".3" e "3." não é realmente um número existente.
Marina K.

9

Desculpe pela formatação feia. Para qualquer número de dígitos:

[0-9]*

Para um ou mais dígitos:

[0-9]+

7

Embora nenhuma das soluções acima atendesse ao meu objetivo, isso funcionou para mim.

var pattern = @"^(-?[1-9]+\d*([.]\d+)?)$|^(-?0[.]\d*[1-9]+)$|^0$|^0.0$";
return Regex.Match(value, pattern, RegexOptions.IgnoreCase).Success;

Exemplo de valores válidos: "3", "-3", "0", "0,0", "1,0", "0,7", "690,7", "0,0001", "-555", "945465464654"

Exemplo de valores não válidos: "a", "", "", ".", "-", "001", "00.2", "000.5", ".3", "3.", "-1" , "--1", "-,1", "-0", "00099", "099"


4

Outra maneira: se você deseja combinar números internacionais como persa ou árabe, use a seguinte expressão:

Regex = new Regex(@"^[\p{N}]+$");

Para corresponder o caractere de período literal, use:

Regex = new Regex(@"^[\p{N}\.]+$");

4

use âncoras de início e de fim.

 Regex regex = new Regex(@"^\d$");
 Use "^\d+$" if you need to match more than one digit.

3

Regex para números inteiros e de ponto flutuante:

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

Um número pode começar com um ponto (sem dígitos iniciais) e um número pode terminar com um ponto (sem dígitos finais). Regex acima reconhecerá ambos como números corretos.

UMA . (ponto) em si, sem dígitos, não é um número correto. É por isso que precisamos de duas partes de regex lá (separadas por um "|").

Espero que isto ajude.


1
Esta é a solução mais completa. Parabéns!
Renato Medeiros

2

Penso que este é o mais simples e aceita a forma europeia e americana de escrever números, por exemplo, EUA 10.555.12 Europeu 10.555,12 Além disso, este não permite várias vírgulas ou pontos um após o outro, por exemplo, 10..22 ou 10, .22 Além desses números, como 0,55 ou 55, passaria. Isso pode ser útil.

^([,|.]?[0-9])+$

1

Se você deseja extrair apenas números de uma sequência, o padrão "\ d +" deve ajudar.


-4

Regex regex = new Regex ("^ [0-9] {1,4} = [0-9] {1,4] $")


5
Você pode explicar sua resposta um pouco, por favor? Você notará que as outras respostas a esta pergunta têm algum nível de explicação sobre o que cada parte da regex faz e que está faltando.
Wai Ha Lee
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.