Regex solo para números


309

No he usado expresiones regulares en absoluto, así que tengo dificultades para solucionar problemas. Quiero que la expresión regular coincida solo cuando la cadena contenida sea todos los números; pero con los dos ejemplos a continuación, coincide con una cadena que contiene todos los números más un signo igual como "1234 = 4321". Estoy seguro de que hay una manera de cambiar este comportamiento, pero como dije, nunca he hecho mucho con expresiones 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
}

En caso de que sea importante, estoy usando C # y .NET2.0.


66
¿Necesita unir números o dígitos ? Por ejemplo: 123.456 es un número, pero no todos son dígitos.
Joel Coehoorn el

Exactamente, OP no es totalmente claro sobre el uso de enteros o no
Sune Rievers

3
¿Por qué no prueba la cadena para ese caso simple? bool decimal. TryParse (string string, out decimal result) o bool int. TryParse (string string, out int result)
Makach

Mire esta respuesta para un tratamiento definitivo de analizar números con expresiones regulares.
tchrist

1
En general, la forma más fácil de solucionar problemas de expresiones Regex, en mi opinión, es mediante el uso de un intérprete de línea de comandos, si su idioma lo permite (parece que la mayoría lo hace). Dado que este ejemplo está en C #, puede usar linqpad.net , o puede usar un punto de interrupción en el depurador y luego usar la ventana Inmediato en VS como CLI.
Andrew

Respuestas:


478

Use los anclajes de inicio y fin.

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

Úselo "^\d+$"si necesita hacer coincidir más de un dígito.


Tenga en cuenta que "\d"coincidirá [0-9]y otros caracteres de dígitos como los números arábigos orientales ٠١٢٣٤٥٦٧٨٩. Use "^[0-9]+$"para restringir las coincidencias solo a los números arábigos del 0 al 9.


Si es necesario incluir ningún representaciones numéricas que no sean dígitos sólo como valores decimales (para empezar), y luego ver @tchrist 's guía completa de análisis de números con expresiones regulares .


¿Qué tal un número establecido de valores numéricos? Esto suele ser así para los códigos postales de ciertos países como India. ¿Supongo que tendremos que hacer una verificación de longitud de cadena después de esto?
Najeeb

2
@Najeeb Sí, dado que los códigos postales indios son números de 6 dígitos, puede usar algo como "^\d{6}$". Algunos otros países tienen reglas más complicadas para los códigos postales, por lo que las soluciones de expresiones regulares para varios países también pueden ser bastante complicadas. Vea algunos de los ejemplos en stackoverflow.com/q/578406/1288
Bill the Lizard

¿Cómo es que si la cadena de entrada es algo como: "3 a" todavía coincidirá? ¿Alguien sabe cómo puedo hacer que coincida SOLO si hay números y nada más (excepto un signo negativo, supongo). Actualmente lo tengo configurado así "-? [0-9] +".
Mateo

105

Su expresión regular coincidirá con cualquier cosa que contenga un número, desea usar anclas para que coincida con toda la cadena y luego coincida con uno o más números:

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

El ^anclará el principio de la cadena, el $anclará el final de la cadena, y la +coincidirá con uno o más de lo que lo precede (un número en este caso).


38

Si necesita tolerar el punto decimal y mil marcadores

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

Necesitará un "-", si el número puede ser negativo.


@ Florin Ghita. Gracias. "-" debe estar al principio.
Andy

3
Esta expresión regular también permite erróneamente que el signo negativo principal ( -) y el punto ( .) ocurran más de una vez.
DavidRR

55
puedes hacer -y .opcional a través de ?. -?\d+(?:\.\d+)?coincidiría con enteros o decimales. (El ?:de los parens sólo hace que los parens un grupo no capturar y utilizados para único grupo para mayor claridad.)
butterywombat

2
Falla en casos extremos como 1, .5, pero si supervisa eso. aún falla para casos básicos como -2. Modifíquelo ^-?[0-9][0-9,\.]*$para evitar fallar en el caso básico. + se reemplaza con *
PrivateOmega

Un escenario que me falta aquí es la notación de Ingeniería (1.2345e-4) ¿alguna sugerencia al respecto?
WolfiG

18

Es coincidente porque encuentra "una coincidencia", no una coincidencia de la cadena completa. Puede solucionar esto cambiando su expresión regular para buscar específicamente el principio y el final de la cadena.

^\d+$

16

Quizás mi método te ayude.

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

3
Sin embargo, tenga en cuenta que eso Char.IsDigitdevuelve truecualquier carácter que sea miembro de la categoría UnicodeCategory.DecimalDigitNumber . Esto puede no ser lo que quiere el OP. Consulte también ¿Por qué Char.IsDigit devuelve verdadero para los caracteres que no se pueden analizar en int? .
DavidRR


16

Esto funciona con enteros y números decimales. No coincide si el número tiene el separador de coma mil,

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

algunas cadenas que coinciden con esto:

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

algunas cadenas que no:

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

11

^ \ d + $, que es "inicio de cadena", "1 o más dígitos", "fin de cadena" en inglés.


10

Si necesita verificar si todos los dígitos son números (0-9) o no,

^[0-9]+$

1425 VERDADERO

0142 VERDADERO

0 VERDADERO

1 VERDADERO

154a25 FALSO

1234 = 3254 FALSO


10

Aquí está mi trabajo:

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

Y algunas pruebas

Pruebas positivas:

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

Pruebas negativas:

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

Comprobado no solo para C #, sino también con Java, Javascript y PHP


".3", "3". en realidad son buenos números (es decir, 0.3 y 3.0 respectivamente). esto lo vemos todo el tiempo en los sistemas fuente, y la mayoría de las funciones to_number (xx) de los idiomas que ha mencionado las reconocerá y las convertirá correctamente. Gracias.
Tagar

1
@Ruslan tiene razón en que en muchos sistemas ".3", "3". analizaría a un número válido y se usaría como mencionaste "0.3" y "3.0". Pero, por otro lado, ese es el valor convertido , por lo que el valor original ".3" y "3." No es realmente el número existente.
Marina K.

9

Perdón por el formato feo. Para cualquier número de dígitos:

[0-9]*

Para uno o más dígitos:

[0-9]+

7

Si bien ninguna de las soluciones anteriores se ajustaba a mi propósito, esto funcionó para mí.

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

Ejemplo de valores válidos: "3", "-3", "0", "0.0", "1.0", "0.7", "690.7", "0.0001", "-555", "945465464654"

Ejemplo de valores no válidos: "a", "", "", ".", "-", "001", "00.2", "000.5", ".3", "3.", "-1" , "--1", "-.1", "-0", "00099", "099"


4

Otra forma: si desea unir números internacionales como el persa o el árabe, puede usar la siguiente expresión:

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

Para coincidir con el uso de caracteres de período literal:

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

4

use anclajes iniciales y finales.

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

3

Regex para números enteros y de coma flotante:

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

Un número puede comenzar con un punto (sin dígitos iniciales), y un número puede terminar con un punto (sin dígitos finales). Por encima de la expresión regular reconocerá ambos como números correctos.

A . (punto) en sí mismo sin ningún dígito no es un número correcto. Es por eso que necesitamos dos partes de expresiones regulares allí (separadas con un "|").

Espero que esto ayude.


1
Esta es la solución más completa. Felicidades!
Renato Medeiros

2

Creo que este es el más simple y acepta la forma de escribir números en Europa y EE. UU., Por ejemplo, EE. UU. 10,555.12 Europeo 10.555,12 Además, este no permite varias comas o puntos uno después del otro, por ejemplo, 10..22 o 10, .22 Además de estos números como .55 o 55 pasarían. Esto puede ser útil.

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


-4

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


55
¿Puedes explicar tu respuesta un poco por favor? Notarás que las otras respuestas a esta pregunta tienen algún nivel de explicación de lo que hace cada parte de la expresión regular, lo que te falta.
Wai Ha Lee
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.