当前位置:  开发笔记 > 编程语言 > 正文

什么是从c#中的字符串中提取5位数字的最快方法

如何解决《什么是从c#中的字符串中提取5位数字的最快方法》经验,为你挑选了2个好方法。

什么是从c#中的字符串中提取5位数的最快方法.

我有

string.Join(null, System.Text.RegularExpressions.Regex.Split(expression, "[^\\d]"));

还有其他人?



1> alexdej..:

正则表达式方法可能是最快的实现,但不是最快的运行方式.我将一个简单的正则表达式解决方案与下面的手动搜索代码进行了比较,发现对于大型输入字符串,手动搜索代码的速度提高约2x-2.5x,对于小字符串,速度提高4倍:

static string Search(string expression)
{
  int run = 0;
  for (int i = 0; i < expression.Length; i++)
  {
    char c = expression[i];
    if (Char.IsDigit(c))
      run++;
    else if (run == 5)
      return expression.Substring(i - run, run);
    else
      run = 0;
  }
  return null;
}
const string pattern = @"\d{5}";
static string NotCached(string expression)
{
  return Regex.Match(expression, pattern, RegexOptions.Compiled).Value;
}

static Regex regex = new Regex(pattern, RegexOptions.Compiled);
static string Cached(string expression)
{
  return regex.Match(expression).Value;
}

结果为~50-char字符串,中间有5位数字符串,超过10 ^ 6次迭代,每次调用的延迟(以微秒为单位)(较小的数字更快):

简单搜索:0.648396us

缓存正则表达式:2.1414645us

非缓存正则表达式:3.070116us

结果是一个~40K字符串,中间有一个5位数字符串,超过10 ^ 4次迭代,每次调用的延迟时间以微秒为单位(较小的数字更快):

简单搜索:423.801us

缓存正则表达式:1155.3948us

非缓存正则表达式:1220.625us

有点令人惊讶:我原本期望Regex(编译为IL)与手动搜索相当,至少对于非常大的字符串.



2> tvanfosson..:

使用正则表达式(\ d {5})查找字符串中5位数字的出现次数,并在匹配项上使用int.Parse或decimal.Parse.

在只有一个号码的情况下text.

int? value = null;
string pat = @"\d{5}"
Regex r = new Regex(pat);
Match m = r.Match(text);
if (m.Success)
{
   value = int.Parse(m.Value);
}

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有