web-dev-qa-db-ja.com

文字列の数値のみを保持しますか?

このようないくつかの文字列があります

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

パレスセンスとダッシュを取り除きたいのですが、言い換えれば数値だけを保持します。

したがって、出力は次のようになります

9143951430

希望する出力を取得するにはどうすればよいですか?

22
meda

次のいずれかを実行します。

  • 正規表現を使用してください。いずれかで正規表現を使用できます

    • 不要な文字(10進数以外の文字)を定義する負の文字クラス:

      _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 ;
      }
      _
    • 何をしたいかを定義する正の文字セット(10進数):

      _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 ;
      }
      _
  • 正規表現を使用する必要もありません。

    • 文字列は_IEnumerable<char>_なので、LINQを直接使用できます。

      _private string CleanStringOfNonDigits_V4( string s )
      {
        if ( string.IsNullOrEmpty(s) ) return s;
        string cleaned = new string( s.Where( char.IsDigit ).ToArray() ) ;
        return cleaned;
      }
      _
    • 表示される10進数字のみが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、最後のバージョンが勝者であるということです。これは1つのテンポラリ(StringBuilder())を作成し、StringBuilderのインプレースバッファー内でインプレース変換を行います。

他のオプションはすべてより多くの作業を行います。

39
Nicholas Carey

正規表現を使用する

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

このようなものを試してください

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

彼はすべて@glengを意味します

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

正規表現の代わりに、LINQメソッドを使用できます。

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

または:

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