2010-04-14 12 views
18

¿Hay alguna forma mejor para conseguir tener una cadena como "(123) 455 a 2344" y obtener "1234552344" de lo que no hacer esto:mejor manera de conseguir todos los dígitos de una cadena

var matches = Regex.Matches(input, @"[0-9]+", RegexOptions.Compiled); 

return String.Join(string.Empty, matches.Cast<Match>() 
           .Select(x => x.Value).ToArray()); 

Tal vez un patrón de expresiones regulares que puede hacerlo en un solo partido? Parece que no pude crear uno para lograr eso.

Respuesta

63

¿Necesita usar un Regex?

return new String(input.Where(Char.IsDigit).ToArray()); 
+4

+1, buena idea. Sin embargo, dejaste un poco de la lambda dentro del lugar. '.Where (c => Char.IsDigit (c))' –

+0

No consideró acercarse a esto desde el nivel de char. –

+10

@Anthony No, mi sintaxis funciona bien y es menos "ruidosa" que la versión expandida. –

8

Usted querrá reemplazar /\D/ (no dígitos) con '' (cadena vacía)

Regex r = new Regex(@"\D"); 
string s = Regex.Replace("(123) 455-2344", r, ""); 

O más brevemente:

string s = Regex.Replace("(123) 455-2344", @"\D",""); //return only numbers from string 
18

¿Tienes algo contra Replace?

return Regex.Replace(input, @"[^0-9]+", ""); 
4

Basta con retirar todos los no-dígitos:

var result = Regex.Replace(input, @"\D", ""); 
0

en Perl (Puede adaptar este a C#) simplemente hacer

$str =~ s/[^0-9]//g; 

Estoy asumiendo que su cadena está en $ str . La idea básica es reemplazar todos los no dígitos con '' (es decir, cadena vacía)

Cuestiones relacionadas