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.