Заменить нечисловую пустую строку

Быстрое добавление требований в наш проект. Поле в нашей БД для хранения номера телефона настроено только на 10 символов. Итак, если мне передают "(913) -444-5555" или что-то еще, есть ли быстрый способ запустить строку через какую-то специальную функцию замены, чтобы я мог передать ей набор символов, чтобы разрешить?

Regex?

Ответ 1

Определенно регулярное выражение:

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

или внутри класса, чтобы избежать повторного создания регулярного выражения все время:

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

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

В зависимости от ваших реальных входов вам может понадобиться какая-то дополнительная логика, чтобы делать такие вещи, как полоса, ведущая 1 (на большие расстояния) или что-нибудь, затягивающее x или X (для расширений).

Ответ 2

Вы можете легко сделать это с помощью регулярного выражения:

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

Ответ 3

Вам не нужно использовать Regex.

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

Ответ 4

Здесь используется способ расширения.

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

Ответ 5

Используя методы Regex в .NET, вы должны иметь возможность сопоставить любую нечисловую цифру с помощью \D, например:

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

Ответ 6

Как насчет метода расширения, который не использует регулярное выражение.

Если вы придерживаетесь одного из параметров Regex, по крайней мере используйте RegexOptions.Compiled в статической переменной.

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

Это основано на ответе Usman Zafar, преобразованном в группу методов.

Ответ 7

для лучшей производительности и более низкого потребления памяти, попробуйте следующее:

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

Результат на моем компьютере:
Init...
Время: 307
Время: 2178

Ответ 8

Я уверен, что есть более эффективный способ сделать это, но я, вероятно, сделаю это:

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

Ответ 9

попробуйте это

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