Ajout rapide dans notre projet. Un champ de notre base de données contenant un numéro de téléphone ne doit contenir que 10 caractères. Ainsi, si on me transmet "(913) -444-5555" ou autre chose, existe-t-il un moyen rapide de faire passer une chaîne par une sorte de fonction de remplacement spéciale pour que je puisse lui transmettre un ensemble de caractères à autoriser?
Regex?
Certainement regex:
string CleanPhone(string phone)
{
Regex digitsOnly = new Regex(@"[^\d]");
return digitsOnly.Replace(phone, "");
}
ou dans une classe pour éviter de recréer la regex tout le temps:
private static Regex digitsOnly = new Regex(@"[^\d]");
public static string CleanPhone(string phone)
{
return digitsOnly.Replace(phone, "");
}
En fonction de vos entrées dans le monde réel, vous souhaiterez peut-être une logique supplémentaire pour effectuer des opérations telles que la suppression des 1 premiers (pour les longues distances) ou tout ce qui se trouve derrière un x ou un X (pour des extensions).
Vous pouvez le faire facilement avec regex:
string subject = "(913)-444-5555";
string result = Regex.Replace(subject, "[^0-9]", ""); // result = "9134445555"
Vous n'avez pas besoin d'utiliser Regex.
phone = new String(phone.Where(c => char.IsDigit(c)).ToArray())
Voici la méthode de la méthode d'extension pour le faire.
public static class Extensions
{
public static string ToDigitsOnly(this string input)
{
Regex digitsOnly = new Regex(@"[^\d]");
return digitsOnly.Replace(input, "");
}
}
En utilisant les méthodes Regex dans .NET, vous devriez être capable de faire correspondre tout chiffre non numérique en utilisant\D, comme suit:
phoneNumber = Regex.Replace(phoneNumber, "\D", "");
Que diriez-vous d'une méthode d'extension qui n'utilise pas de regex.
Si vous vous en tenez à l’une des options de Regex, utilisez au moins RegexOptions.Compiled
dans la variable statique.
public static string ToDigitsOnly(this string input)
{
return new String(input.Where(char.IsDigit).ToArray());
}
Cela s'appuie sur la réponse de Usman Zafar convertie en 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...");
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, "");
}
}
Le résultat sur mon ordinateur est:
Init ...
Heure: 307
Heure: 2178
Je suis sûr qu'il existe un moyen plus efficace de le faire, mais je ferais probablement ceci:
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();
}