2010-06-16 29 views
64

Necesito que el texto como "joe ($ 3,004.50)" se filtre a 3004.50 pero soy terrible en regex y no puedo encontrar una solución adecuada. Por lo tanto, solo deben permanecer los números y los períodos, todo lo demás se filtrará. Yo uso C# y VS.net marco 2008 3,5Regex para eliminar todo (período OR no numérico)

Respuesta

124

Esto debe hacerlo:

string s = "joe ($3,004.50)"; 
s = Regex.Replace(s, "[^0-9.]", ""); 
+0

¡No sabía que podía hacer esto, gracias! – VoodooChild

+0

gracias de hecho :) –

+0

¿Qué pasa con 'joe.smith ($ 3,004.50)'? Simplemente eliminar las clases de personajes ofensivos puede ir bastante mal. –

26

La expresión regular es:

[^0-9.] 

puede almacenar en caché la expresión regular:

Regex not_num_period = new Regex("[^0-9.]") 

a continuación, utilizar:

string result = not_num_period.Replace("joe ($3,004.50)", ""); 

Sin embargo, debe tener en cuenta que algunas culturas tienen diferentes convenciones para escribir montos monetarios, como por ejemplo: 3.004,50.

+0

ATM Demasiado perezoso para verificar, pero no tiene que escapar el . ? –

+6

@Andrew: no, dentro de una clase de personaje, '.' no tiene ningún significado especial. –

0

El enfoque de la eliminación de caracteres problemáticos es potencialmente problemática. ¿Qué pasa si hay otro . en la cadena en alguna parte? No se eliminará, ¡aunque debería!

Al eliminar los dígitos o los puntos, la cadena joe.smith ($3,004.50) se transformaría en el .3004.50 no dispersable.

Imho, es mejor hacer coincidir un patrón específico, y extraerlo usando un grupo. Algo sencillo sería encontrar todos contiguos comas, dígitos y períodos con expresión regular:

[\d,\.]+ 

muestra de ensayo por:

Pattern understood as: 
[\d,\.]+ 
Enter string to check if matches pattern 
> a2.3 fjdfadfj34 34j3424 2,300 adsfa  
Group 0 match: "2.3" 
Group 0 match: "34" 
Group 0 match: "34" 
Group 0 match: "3424" 
Group 0 match: "2,300" 

Luego, para cada partido, eliminar todas las comas y enviar eso al analizador. Para manejar el caso de algo como 12.323.344, podría hacer otra comprobación para ver que una subcadena coincidente tiene como máximo un ..

+0

Esta expresión regular coincide con todo. – mindriot

+0

@mindriot corregido, el primero \ d debería ser un + –

+0

Ahora coincide con todo excepto '" "'. – mindriot

2

Para la respuesta aceptada, MatthewGunn plantea un punto válido en el sentido de que todos los dígitos, comas y puntos en toda la cadena se condensarán juntos. Esto evitará que:

string s = "joe.smith ($3,004.50)"; 
Regex r = new Regex(@"(?:^|[^w.,])(\d[\d,.]+)(?=\W|$)/)"); 
Match m = r.match(s); 
string v = null; 
if (m.Success) { 
    v = m.Groups[1].Value; 
    v = Regex.Replace(v, ",", ""); 
} 
0

Que se trata de una cadena - cadena es un IEumerable<char>, por lo que puede utilizar LINQ:

var input = "joe ($3,004.50)"; 
var result = String.Join("", input.Where(c => Char.IsDigit(c) || c == '.')); 

Console.WriteLine(result); // 3004.50 
Cuestiones relacionadas