このようないくつかの文字列があります
string phoneNumber = "(914) 395-1430";
パレスセンスとダッシュを取り除きたいのですが、言い換えれば数値だけを保持します。
したがって、出力は次のようになります
9143951430
希望する出力を取得するにはどうすればよいですか?
次のいずれかを実行します。
正規表現を使用してください。いずれかで正規表現を使用できます
不要な文字(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のインプレースバッファー内でインプレース変換を行います。
他のオプションはすべてより多くの作業を行います。
正規表現を使用する
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));