只保留字符串中的数值?

时间:2013-10-03 19:31:17

标签: c# regex string numeric

我有一些像这样的字符串

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

我想剥去parethenses和破折号,换句话说就是保留数值。

所以输出看起来像这样

9143951430

如何获得所需的输出?

6 个答案:

答案 0 :(得分:35)

您可以执行以下任何操作:

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

    一起使用
    • 负字符类,用于定义您不想要的字符(除十进制数字以外的字符):

      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,即最后一个版本,是胜利者。它创建一个临时的 - StringBuilder()并在StringBuilder的就地缓冲区内就地进行转换。

其他选项都可以做更多工作。

答案 1 :(得分:16)

使用reg表达式

 string result = Regex.Replace(phoneNumber, @"[^\d]", "");

答案 2 :(得分:11)

尝试这样的事情

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

答案 3 :(得分:9)

string phoneNumber = "(914) 395-1430";
var numbers = String.Join("", phoneNumber.Where(char.IsDigit));

答案 4 :(得分:4)

他意味着一切@gleng

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

答案 5 :(得分:1)

您可以使用LINQ方法代替正则表达式:

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

或:

phoneNumber = String.Concat(phoneNumber.Where(Char.IsDigit));