このような文字列がいくつかあります
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 ; }
必要なものを定義する正の文字セット (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 ; }
正規表現を使用する必要もありません。
文字列は であるため、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 が勝者になるのではないかと思います。一時的な要素を 1 つ作成し、StringBuilder()
StringBuilder のインプレース バッファー内でインプレース変換を実行します。
他のオプションはすべてより多くの作業を実行します。