Remplacer non numérique par une chaîne vide

Ajout rapide de l’exigence dans notre projet. Un champ de notre firebase database contenant un numéro de téléphone ne permet que 10 caractères. Donc, si je suis passé “(913) -444-5555” ou autre chose, existe-t-il un moyen rapide d’exécuter une chaîne via une sorte de fonction de remplacement spéciale que je peux lui transmettre avec un ensemble de caractères à autoriser?

Regex?

Certainement regex:

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

ou dans une classe pour éviter de recréer le regex tout le temps:

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

Selon vos entrées réelles, vous voudrez peut-être une logique supplémentaire pour faire des choses comme supprimer les 1 principaux (pour les longues distances) ou tout ce qui suit un x ou un X (pour les extensions).

Vous pouvez le faire facilement avec regex:

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

Vous n’avez pas besoin d’utiliser Regex.

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

Voici la méthode de la méthode d’extension.

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

En utilisant les méthodes Regex dans .NET, vous devriez pouvoir faire correspondre tout chiffre non numérique en utilisant \ D, comme ceci:

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

Que diriez-vous d’une méthode d’extension qui n’utilise pas l’expression régulière.

Si vous vous en tenez à l’une des options Regex, utilisez au moins RegexOptions.Comstackd dans la variable statique.

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

Ceci s’appuie sur la réponse d’Usman Zafar convertie en un groupe de méthodes.

pour obtenir les meilleures performances et réduire la consommation de mémoire, essayez ceci:

 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..."); ssortingng 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, ""); } } 

Le résultat dans mon ordinateur est le suivant:
Init ...
Heure: 307
Heure: 2178

Je suis sûr qu’il y a un moyen plus efficace de le faire, mais je le ferais probablement:

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

essaye ça

 public static ssortingng cleanPhone(ssortingng 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(); }