2013-10-03 54 views
10

我有一些字符串這樣只保留字符串中的數字值嗎?

string phoneNumber = "(914) 395-1430"; 

我想帶出的parethenses和破折號,換句話說只是不停的數值。

所以輸出可能看起來像這樣

9143951430 

如何獲得所需的輸出?

+2

即使你沒有經驗的正則表達式,你至少應該做一些研究。答案的數量與問題的難度成反比。 – Jerry

+0

總有像你這樣的人抱怨問題,這是一個問答網站,如果我知道我不會問謝謝! – meda

+2

@meda - 你不知道如何谷歌? –

回答

21

你做任何以下的:

  • 使用正則表達式。您可以使用正則表達式與任何

    • 一個否定的字符類,定義是你不想要的東西(除了十進制數字之外的那些字符)的字符:

      private static readonly Regex rxNonDigits = new Regex(@"[^\d]+"); 
      

      在這種情況下, ,你可以做採取這些方法的執行:

      // simply replace the offending substrings with an empty string 
      private string CleanStringOfNonDigits_V1(string s) 
      { 
          if (string.IsNullOrEmpty(s)) return s ; 
          string cleaned = rxNonDigits.Replace(s, "") ; 
          return cleaned ; 
      } 
      
      // split the string into an array of good substrings 
      // using the bad substrings as the delimiter. Then use 
      // String.Join() to splice things back together. 
      private string CleanStringOfNonDigits_V2(string s) 
      { 
          if (string.IsNullOrEmpty(s)) return s; 
          string cleaned = String.Join(rxNonDigits.Split(s)); 
          return cleaned ; 
      } 
      
    • 積極的字符集,它定義你想要什麼(小數位數):

      private static Regex rxDigits = new Regex(@"[\d]+") ; 
      

      在這種情況下,你可以做這樣的事情:

      private string CleanStringOfNonDigits_V3(string s) 
      { 
          if (string.IsNullOrEmpty(s)) return s ; 
          StringBuilder sb = new StringBuilder() ; 
          for (Match m = rxDigits.Match(s) ; m.Success ; m = m.NextMatch()) 
          { 
          sb.Append(m.Value) ; 
          } 
          string cleaned = sb.ToString() ; 
          return cleaned ; 
      } 
      
  • 使用正則表達式,無論是你不需要的。

    • 你可以直接使用LINQ,因爲一個字符串就是一個IEnumerable<char>

      private string CleanStringOfNonDigits_V4(string s) 
      { 
          if (string.IsNullOrEmpty(s)) return s; 
          string cleaned = new string(s.Where(char.IsDigit).ToArray()) ; 
          return cleaned; 
      } 
      
    • 如果你只處理與西方字母,唯一的十進制數字,你會看到的都是ASCII,跳繩char.IsDigit可能會買你一個小的性能:

      private string CleanStringOfNonDigits_V5(string s) 
      { 
          if (string.IsNullOrEmpty(s)) return s; 
          string cleaned = new string(s.Where(c => c-'0' < 10).ToArray()) ; 
          return cleaned; 
      } 
      
  • 最後,你可以簡單地遍歷字符串,夾緊你不想要的數字,像這樣:

    private string CleanStringOfNonDigits_V6(string s) 
    { 
        if (string.IsNullOrEmpty(s)) return s; 
        StringBuilder sb = new StringBuilder(s.Length) ; 
        for (int i = 0; i < s.Length; ++i) 
        { 
        char c = s[i]; 
        if (c < '0') continue ; 
        if (c > '9') continue ; 
        sb.Append(s[i]); 
        } 
        string cleaned = sb.ToString(); 
        return cleaned; 
    } 
    

    或者這樣:

    private string CleanStringOfNonDigits_V7(string s) 
    { 
        if (string.IsNullOrEmpty(s)) return s; 
        StringBuilder sb = new StringBuilder(s); 
        int j = 0 ; 
        int i = 0 ; 
        while (i < sb.Length) 
        { 
        bool isDigit = char.IsDigit(sb[i]) ; 
        if (isDigit) 
        { 
         sb[j++] = sb[i++]; 
        } 
        else 
        { 
         ++i ; 
        } 
        } 
        sb.Length = j; 
        string cleaned = sb.ToString(); 
        return cleaned; 
    } 
    

從一個清晰的立場和代碼清潔,版本1是你想要的。很難打敗一個班輪。

如果表現很重要,我懷疑版本7是最後一個版本。它創建一個臨時的— a StringBuilder()並在StringBuilder的in-place緩衝區內原地進行轉換。

其他選項都做更多的工作。

+3

哇,一個非常詳細的答案,你的回答比我的問題更多,這給了我更多的選擇和理解 像你這樣的用戶正在使這是一個偉大的社區。 非常感謝! – meda

11

使用reg表達式

string result = Regex.Replace(phoneNumber, @"[^\d]", ""); 
7
string phoneNumber = "(914) 395-1430"; 
var numbers = String.Join("", phoneNumber.Where(char.IsDigit)); 
4

他意味着一切@gleng

Regex rgx = new Regex(@"\D"); 
str = rgx.Replace(str, ""); 
+0

The '@'很重要! – Jerry

+0

謝謝。但你能記得我爲什麼嗎?我前一段時間在使用,但爲什麼不記得?它的原因是它是文本:/ – Darka

+0

'@'將文本轉換爲原始文本,因此您不需要轉義反斜槓。否則,你會得到一個程序嘗試替換,並最終只有一個「D」的正則表達式。 – Jerry

10

嘗試這樣的事情

return new String(input.Where(Char.IsDigit).ToArray()); 
1

而不是一個正則表達式,你可以使用LINQ方法:

phoneNumber = String.Concat(phoneNumber.Where(c => c >= '0' && c <= '9')); 

或:

phoneNumber = String.Concat(phoneNumber.Where(Char.IsDigit)); 
相關問題