우리 프로젝트의 요구 사항에 대한 빠른 추가. 전화 번호를 보유 할 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