답변:
확실히 정규식 :
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 뒤에 오는 것 (확장자)을 제거하는 등의 추가 논리가 필요할 수 있습니다.
[^\d]
로 단순화 할 수있다\D
정규식을 사용할 필요가 없습니다.
phone = new String(phone.Where(c => char.IsDigit(c)).ToArray())
system.linq;
최상의 성능과 낮은 메모리 소비를 위해 다음을 시도하십시오.
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
더 효율적인 방법이 있다고 확신하지만 아마도 이렇게 할 것입니다.
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();
}
이 시도
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();
}
return newPhone.ToString();
"System.Char []"를 반환합니다. 나는 당신이 의미 생각 return new string(newPhone);
하지만이 또한 숫자 0 때문에 9 필터링됩니다 >
및 <
대신 >=
하고 <=
. 그러나 newPhon
배열이 필요한 것보다 길기 때문에 문자열에도 후행 공백이 생깁니다 .