Сохранять только числовое значение из строки?

У меня есть несколько строк, таких как

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

Я хотел бы разделить парефенсы и тире, другими словами просто сохраняйте числовые значения.

Таким образом, результат может выглядеть следующим образом:

9143951430

Как получить желаемый результат?

Ответ 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.

Другие варианты делают больше работы.

Ответ 2

использовать выражение reg

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

Ответ 3

попробуйте что-то вроде этого

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

Ответ 4

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

Ответ 5

Он означает все @gleng

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

Ответ 6

Вместо обычного выражения вы можете использовать метод LINQ:

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

или

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