web-dev-qa-db-fra.com

Remplacez non numérique par une chaîne vide

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?

122
Matt Dawdy

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).

243
Joel Coehoorn

Vous pouvez le faire facilement avec regex:

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

Vous n'avez pas besoin d'utiliser Regex.

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

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, "");
    }
}
23
Aaron

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", "");
8
Wes Mason

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.

4
Michael Lang

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

4
Max-PC

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();
}
3
Jon Norton