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

本文关键字:5位 提取 方法 字符串 什么 | 更新日期: 2023-09-27 17:48:48

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

我有

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

还有其他的吗?

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

regex方法可能是实现最快的方法,但不是运行最快的。我将一个简单的regex解决方案与以下手动搜索代码进行了比较,发现手动搜索代码对大输入字符串的速度快约2x-2.5倍,对小字符串的速度高达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;
}

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

简单搜索:0.648396us

缓存Regex:2.1414645us

非缓存Regex:3.070116us

在10^4次迭代中,中间有5位数字符串的40K字符串的结果,每次调用的延迟以微秒为单位(数字越小越快):

简单搜索:423.801us

缓存Regex:11155.3948us

非缓存Regex:12206.25us

有点令人惊讶:我本以为Regex(编译为IL)可以与手动搜索相媲美,至少对于非常大的字符串来说是这样。

使用正则表达式(''d{5})查找字符串中5位数字的出现位置,并使用int.Parse或decimal。分析匹配项。

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);
}

您的意思是将字符串转换为数字吗?或者找到第一个5位数的字符串,然后将其设为数字?无论哪种方式,您都可能使用十进制。解析或int.Parse.

我认为正则表达式是错误的方法。一种更有效的方法是简单地遍历字符串,寻找一个数字,然后前进4个字符,看看它们是否都是数字。如果是,那么您就得到了子字符串。它没有那么健壮,不,但它也没有开销。

根本不要使用正则表达式。它比你需要的要强大得多,而且这种力量很可能会影响性能。

如果你能提供更多你需要它做什么的细节,我们可以编写合适的代码。。。(测试用例将是理想的。)

如果数字与其他字符一起存在,正则表达式是一个很好的解决方案。

例如:([0-9]{5})

将匹配-asdfkki12345afdkjsdl、12345adfaksk或akdkfa12345

如果您有一个像"12345"甚至"12345abcd"这样的简单测试用例,那么根本不要使用regex。他们不知道他们的速度。

对于大多数字符串,暴力方法将比RegEx更快。

一个相当普通的例子是:

string strIWantNumFrom = "qweqwe23qeeq3eqqew9qwer0q";
int num = int.Parse(
    string.Join( null, (
        from c in strIWantNumFrom.ToCharArray()
        where c == '1' || c == '2' || c == '3' || c == '4' || c == '5' ||
            c == '6' || c == '7' || c == '8' || c == '9' || c == '0'
        select c.ToString()
    ).ToArray() ) );

毫无疑问,有更快的方法,还有很多优化,这取决于字符串的确切格式。

这可能会更快。。。

public static string DigitsOnly(string inVal)
        {
            char[] newPhon = new char[inVal.Length];
            int i = 0;
            foreach (char c in inVal)
                if (c.CompareTo('0') > 0 && c.CompareTo('9') < 0)
                    newPhon[i++] = c;
            return newPhon.ToString();
        }

如果你想把它限制在最多五位数,那么

public static string DigitsOnly(string inVal)
        {
            char[] newPhon = new char[inVal.Length];
            int i = 0;
            foreach (char c in inVal)
                if (c.CompareTo('0') > 0 && c.CompareTo('9') < 0 && i < 5)
                    newPhon[i++] = c;
            return newPhon.ToString();
        }