webentwicklung-frage-antwort-db.com.de

Ersetzen Sie nicht numerische durch leere Zeichenfolge

Schnelle Add-On-Anforderung in unserem Projekt. In einem Feld in unserer Datenbank, in dem sich eine Telefonnummer befindet, sind nur 10 Zeichen zulässig. Wenn ich also "(913) -444-5555" oder irgendetwas anderes übergebe, gibt es eine schnelle Möglichkeit, eine Zeichenfolge durch eine spezielle Ersetzungsfunktion zu führen, mit der ich eine Reihe von Zeichen übergeben kann, die zulässig sind?

Regex?

122
Matt Dawdy

Auf jeden Fall Regex:

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

oder innerhalb einer Klasse, um zu vermeiden, dass der reguläre Ausdruck ständig neu erstellt wird:

private static Regex digitsOnly = new Regex(@"[^\d]");   

public static string CleanPhone(string phone)
{
    return digitsOnly.Replace(phone, "");
}

Abhängig von Ihren Eingaben in der realen Welt möchten Sie möglicherweise zusätzliche Logik verwenden, um beispielsweise führende Einsen (für große Entfernungen) oder X- oder X-Zeichen (für Erweiterungen) zu entfernen.

243
Joel Coehoorn

Mit Regex geht das ganz einfach:

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

Sie müssen Regex nicht verwenden.

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

Hier ist die Methode zur Erweiterung.

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

Wenn Sie die Regex-Methoden in .NET verwenden, sollten Sie in der Lage sein, mit\D eine beliebige nicht numerische Ziffer abzugleichen. Beispiel:

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

Wie wäre es mit einer Erweiterungsmethode, die Regex nicht verwendet.

Wenn Sie sich an eine der Regex-Optionen halten, verwenden Sie mindestens RegexOptions.Compiled in der statischen Variablen.

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

Dies baut auf der Antwort von Usman Zafar auf, die in eine Methodengruppe konvertiert wurde.

4
Michael Lang

versuchen Sie Folgendes, um die beste Leistung und einen geringeren Speicherverbrauch zu erzielen:

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

Das Ergebnis auf meinem Computer ist:
Drin...
Zeit: 307
Zeit: 2178

4
Max-PC

Ich bin mir sicher, dass es einen effizienteren Weg gibt, aber ich würde dies wahrscheinlich tun:

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