Ответ 1
Вы выполните одно из следующих действий:
-
Используйте регулярные выражения. Вы можете использовать регулярное выражение с помощью
-
Отрицательный класс символов, который определяет символы, которые вы не хотите (эти символы, отличные от десятичных цифр):
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.
Другие варианты делают больше работы.