只保留字符串中的数值?

我有一些像这样的字符串

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

       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可能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就是您想要的。 打一个class轮很难。

如果性能很重要,我怀疑版本7,即最后一个版本,是胜利者。 它创建一个临时的 - 一个StringBuilder()并在StringBuilder的就地缓冲区中就地进行转换。

其他选项都做得更多。

使用reg表达式

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

尝试这样的事情

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

他的意思是@gleng

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

不使用正则表达式,您可以使用LINQ方法:

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

要么:

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