varios una texto reemplazar recortar quitar extraer especiales ejemplos caracteres cadena buscar c# regex string phone-number

una - replace c# varios caracteres



Reemplazar no numérico con cadena vacía (9)

¿Qué tal un método de extensión que no utiliza expresiones regulares?

Si te apegas a una de las opciones de Regex, al menos usa RegexOptions.Compiled en la variable estática.

public static string ToDigitsOnly(this string input) { return new String(input.Where(char.IsDigit).ToArray()); }

Esto se basa en la respuesta de Usman Zafar convertida en un grupo de métodos.

Requisito de complemento rápido en nuestro proyecto. Un campo en nuestro DB para mantener un número de teléfono está configurado para permitir solo 10 caracteres. Entonces, si me pasan "(913) -444-5555" o cualquier otra cosa, ¿hay una forma rápida de ejecutar una cadena a través de algún tipo de función de reemplazo especial que pueda pasarle un conjunto de caracteres para permitir?

Regex?


Aquí está la forma del método de extensión de hacerlo.

public static class Extensions { public static string ToDigitsOnly(this string input) { Regex digitsOnly = new Regex(@"[^/d]"); return digitsOnly.Replace(input, ""); } }


Definitivamente regex:

string CleanPhone(string phone) { Regex digitsOnly = new Regex(@"[^/d]"); return digitsOnly.Replace(phone, ""); }

o dentro de una clase para evitar volver a crear la expresión regular todo el tiempo:

private static Regex digitsOnly = new Regex(@"[^/d]"); public static string CleanPhone(string phone) { return digitsOnly.Replace(phone, ""); }

Dependiendo de sus entradas en el mundo real, es posible que desee algo de lógica adicional para hacer cosas como quitar los primeros 1 (para larga distancia) o cualquier cosa detrás de una x o X (para extensiones).


Estoy seguro de que hay una manera más eficiente de hacerlo, pero probablemente haga esto:

string getTenDigitNumber(string input) { StringBuilder sb = new StringBuilder(); for(int i - 0; i < input.Length; i++) { int junk; if(int.TryParse(input[i], ref junk)) sb.Append(input[i]); } return sb.ToString(); }


No necesita usar Regex.

phone = new String(phone.Where(c => char.IsDigit(c)).ToArray())


Puedes hacerlo fácilmente con regex:

string subject = "(913)-444-5555"; string result = Regex.Replace(subject, "[^0-9]", ""); // result = "9134445555"


Usando los métodos Regex en .NET, usted debería poder hacer coincidir cualquier dígito no numérico usando / D, así:

phoneNumber = Regex.Replace(phoneNumber, "/D", "");


para obtener el mejor rendimiento y menor consumo de memoria, intente esto:

using System; using System.Diagnostics; using System.Text; using System.Text.RegularExpressions; public class Program { private static Regex digitsOnly = new Regex(@"[^/d]"); public static void Main() { Console.WriteLine("Init..."); string phone = "001-12-34-56-78-90"; var sw = new Stopwatch(); sw.Start(); for (int i = 0; i < 1000000; i++) { DigitsOnly(phone); } sw.Stop(); Console.WriteLine("Time: " + sw.ElapsedMilliseconds); var sw2 = new Stopwatch(); sw2.Start(); for (int i = 0; i < 1000000; i++) { DigitsOnlyRegex(phone); } sw2.Stop(); Console.WriteLine("Time: " + sw2.ElapsedMilliseconds); Console.ReadLine(); } public static string DigitsOnly(string phone, string replace = null) { if (replace == null) replace = ""; if (phone == null) return null; var result = new StringBuilder(phone.Length); foreach (char c in phone) if (c >= ''0'' && c <= ''9'') result.Append(c); else { result.Append(replace); } return result.ToString(); } public static string DigitsOnlyRegex(string phone) { return digitsOnly.Replace(phone, ""); } }

El resultado en mi computadora es:
En eso...
Tiempo: 307
Tiempo: 2178


prueba esto

public static string cleanPhone(string inVal) { char[] newPhon = new char[inVal.Length]; int i = 0; foreach (char c in inVal) if (c.CompareTo(''0'') > 0 && c.CompareTo(''9'') < 0) newPhon[i++] = c; return newPhon.ToString(); }