2008-11-04 166 views
101

在我們的項目中快速添加需求。我們數據庫中的一個字段用於保存電話號碼,該字段僅允許輸入10個字符。所以,如果我通過了「(913)-444-5555」或其他任何東西,是否有一種快捷方式通過某種特殊的替換函數來運行字符串,我可以將它傳遞給一組字符以允許?用空字符串替換非數字

正則表達式?

回答

206

絕對的正則表達式:

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(用於擴展)的東西。

+0

那很完美。這隻用了幾次,所以我們不需要創建一個類,並且就領先的1而言,這並不是一個壞主意。但我認爲我寧願在個案基礎上處理,至少在這個項目中。再次感謝 - 如果我可以再次投票,我會的。 – 2008-11-04 17:01:30

+1

我在等待有人發佈這個擴展方法版本的字符串類:) – 2008-11-04 17:33:23

+0

@Joel我在下面添加了擴展方法版本。猜猜評論不支持降價。 – Aaron 2011-10-21 18:07:49

3

我敢肯定有一個更有效的方式來做到這一點,但我可能會做這樣的:

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

這是我的第一本能,也是我爲什麼在這裏問的原因。 RegEx對我來說似乎是一個更好的解決方案。但謝謝你的答案! – 2008-11-04 17:03:53

65

你可以用正則表達式輕鬆地做到這一點:

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

使用正則表達式的方法在.NET中,你應該能夠匹配使用\ d任何非數字的位數,就像這樣:

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

試試這個

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

這是擴展方法。

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

你不需要使用正則表達式。

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

如何使用不使用正則表達式的擴展方法。

如果你堅持使用正則表達式選項之一,至少在靜態變量中使用RegexOptions.Compiled

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

這建立在Usman Zafar的答案轉換爲方法組。

4

最佳的性能和更低的內存消耗,試試這個:

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