9

英数字を数字のみの文字列に変換する高速/効率的な方法を探しています

例: +123-456/7890 は 1234567890 になります。

既存のコードは

foreach(char c in str.ToCharArray() )
  if ( char.IsDigit(c) ) stringBuilder.Append(c);

return stringBuilder.ToString();
4

5 に答える 5

5

LINQ ソリューション:

return new string(str.Where(char.IsDigit).ToArray());

より効率的かどうかはわかりません。少なくとも正規表現ではありません!

于 2012-04-30T07:03:19.747 に答える
4
string str="+123-456/7890";
long onlyNumbers= Convert.ToInt64(Regex.Replace(str, @"\D", ""));
于 2012-04-30T06:38:02.300 に答える
2

これが見つかった別の解決策です

string justNumbers = new String(text.Where(Char.IsDigit).ToArray());
int numbers = Convert.ToInt32(justNumbers); 
于 2012-04-30T06:43:10.627 に答える
2

はい、RegExはとりわけ高速です。RegexOptions.Compiledを使用して比較をさらに高速化し、負/正のケースに一致させ、それらを別々に配置できます(そのような文字列が存在する場合)

例えば

Regex numberOnlyRegEx = new Regex(@"[^0-9]+", RegexOptions.Compiled);

if (!numberOnlyRegEx.IsMatch(str))
  return 0; //default value;

return Convert.ToInt32(numberOnlyRegEx .Replace(str, "[^0-9]+", ""));
于 2012-04-30T06:40:13.803 に答える
1

この状況で正規表現を使用しないようにする多くの回答を見た後、実際にこの特定のケースでは正規表現がはるかに高速に機能すると言いたいです。このコードスニペットを使用して実行にかかる時間を計算してみました

によって提案された方法

編集:これらは 2 つの完全に反対の出力を提供します。Visual Studio IDE よりも Ideone を完全に信頼する必要があるかどうかはわかりません。

于 2012-04-30T07:15:02.347 に答える