2008-11-07 29 views
226

No he usado expresiones regulares, así que estoy teniendo problemas para solucionar problemas. Quiero que la expresión regular coincida solo cuando la cadena contenida sea de números; pero con los dos ejemplos a continuación, está haciendo coincidir 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 hice mucho con expresiones regulares.Regex solo para números

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 importe, estoy usando C# y .NET2.0.

+3

¿Por qué no TryParse la cadena para ese caso simple? bool decimal.TryParse (serie de cadena, resultado decimales) o bool int.TryParse (serie de cadena, resultado out out) – Makach

+0

Try.Parse aceptará un signo más o menos al inicio y espacios iniciales/finales. –

+5

¿Necesita hacer coincidir _numbers_ o _digits_? Por ejemplo: 123.456 es un número, pero no todos son dígitos. –

Respuesta

379

Utilice los anclajes inicial y final.

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

Uso "^\d+$" si es necesario para que coincida con más de un dígito.


Tenga en cuenta que "\d" coincidirá con [0-9] y otros caracteres como dígitos los números arábigos del Este ٠١٢٣٤٥٦٧٨٩. "^[0-9]+$" utilizar para restringir partidos que sólo los números arábigos 0 - 9.


Si es necesario incluir ningún representaciones numéricas que no sean sólo cifras (como valores decimales para empezar), y luego ver @tchrist 's comprehensive guide to parsing numbers with regular expressions.

15

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

^\d+$ 
80

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

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

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

11

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

0

Si desea extraer solo números de una cadena, el patrón "\ d +" debería ayudar.

24

si es necesario tolerar punto decimal y miles de marcador ...

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

actualización: necesitará "-", si el número puede ser negativo. actualización: movido "-" al principio para evitar que emparejan no de partida "-"

+0

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

+12

'- ,, ....,., .. ,, .. ,,.'? – jpillora

+2

Esta expresión regular también permite erróneamente que el signo negativo inicial ('-') y el período (' .') se produzcan más de una vez. – DavidRR

4

Otra forma: Si te gusta para que coincida con los números internacionales como persa o árabe, por lo que puede utilizar siguiente expresión:

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

para que coincida con el uso literal carácter de época:

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

Tal vez mi método le ayudará.

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

Tenga en cuenta que ['Char.IsDigit'] (http://msdn.microsoft.com) /en-us/library/0t641e58%28v=vs.110%29.aspx) devuelve 'true' para cualquier carácter que sea miembro de [UnicodeCategory.DecimalDigitNumber] (http://msdn.microsoft.com/en- categoría us/library/system.globalization.unicodecategory (v = vs.110) .aspx). 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?] (Http://stackoverflow.com/q/22063436/1497596). – DavidRR

+0

Consulte [Caracteres Unicode en la categoría 'Número, Dígito Decimal'] (http://www.fileformat.info/info/unicode/category/Nd/list.htm). – DavidRR

9

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 coincide con esta:

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. 
7

este momento para el formato feo Para cualquier número de dígitos:

[0-9]* 

para uno o más dígitos:

[0-9]+ 
6

Si es necesario comprobar si todos los dígitos son el número (0-9) o no,

^[0-9]+$ 

1425 VERDADERO

0142 VERDADERO

0 TRUE

1 TRUE

154a25 FALSO

1234 = 3254 FALSO

-1

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

+1

¿Puedes explicar tu respuesta un poco por favor? Notarás que las otras respuestas a esta pregunta tienen un cierto nivel de explicación de lo que hace cada parte de la expresión regular, de la cual careces. –

8

Aquí está mi trabajando uno:

^(-?[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"}; 

facturado no sólo para C#, pero también con Java, Javascript y PHP

+0

".3", "3". en realidad son buenos números (significando 0.3 y 3.0 respectivamente). vemos esto 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án y las convertirán correctamente. Gracias. – Tagar

+1

@Ruslan tienes razón en que en muchos sistemas ".3", "3". analizaría el número válido y lo usaría como mencionó "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. –

0

expresión regular para los números enteros y de punto floting:

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

Un número puede comenzar con un punto (sin dígitos iniciales), y un número puede finalizar con un punto (sin dígitos posteriores). Above regex reconocerá ambos como números correctos. A. (punto) sin dígitos no es un número correcto. Es por eso que necesitamos dos partes de expresiones regulares allí (separadas por un "|").

Espero que esto ayude.

3

utilizan anclajes de inicio y final.

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

Creo que este es el más simple y acepta la manera europea y americana de escribir números, p. USA 10,555.12 European 10,555,12 Además, este no permite el uso de varias comas o puntos, por ejemplo. 10..22 o 10, .22 Además de esto, pasarían números como .55 o, 55. Esto puede ser útil.

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

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", "0.3" , "3", "-1", "--1", "-.1", " - 0 ", " 00099 ", " 099 "

Cuestiones relacionadas