• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

只保留字符串中的数字值吗?

c/c++ 来源:meda 3次浏览

我有一些字符串这样只保留字符串中的数字值吗?

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

我想带出的parethenses和破折号,换句话说只是不停的数值。

所以输出可能看起来像这样

9143951430 

如何获得所需的输出?


===========解决方案如下:

你做任何以下的:

  • 使用正则表达式。您可以使用正则表达式与任何

    • 一个否定的字符类,定义是你不想要的东西(除了十进制数字之外的那些字符)的字符:

      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缓冲区内原地进行转换。

其他选项都做更多的工作。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)