[C#] 숫자가 아닌 문자열을 빈 문자열로 교체

우리 프로젝트의 요구 사항에 대한 빠른 추가. 전화 번호를 보유 할 DB의 필드는 10 자만 허용하도록 설정되어 있습니다. 따라서 “(913) -444-5555″또는 기타 다른 항목을 전달받는 경우 허용 할 문자 세트를 전달할 수있는 특수 대체 기능을 통해 문자열을 실행하는 빠른 방법이 있습니까?

정규식?



답변

확실히 정규식 :

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 뒤에 오는 것 (확장자)을 제거하는 등의 추가 논리가 필요할 수 있습니다.


답변

정규식으로 쉽게 할 수 있습니다.

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


답변

정규식을 사용할 필요가 없습니다.

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


답변

확장 방법은 다음과 같습니다.

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


답변

.NET에서 Regex 메소드를 사용하면 다음과 같이 \ D를 사용하여 숫자가 아닌 숫자를 일치시킬 수 있습니다.

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


답변

정규식을 사용하지 않는 확장 방법은 어떻습니까?

정규식 옵션 중 하나를 고수하면 적어도 RegexOptions.Compiled정적 변수에 사용 하십시오.

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

이는 메소드 그룹으로 변환 된 Usman Zafar의 답변을 기반으로합니다.


답변

최상의 성능과 낮은 메모리 소비를 위해 다음을 시도하십시오.

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

내 컴퓨터의 결과는 다음과 같습니다 :
초기화 …
시간 : 307
시간 : 2178