什么是从c#中的字符串中提取5位数的最快方法.
我有
string.Join(null, System.Text.RegularExpressions.Regex.Split(expression, "[^\\d]"));
还有其他人?
正则表达式方法可能是最快的实现,但不是最快的运行方式.我将一个简单的正则表达式解决方案与下面的手动搜索代码进行了比较,发现对于大型输入字符串,手动搜索代码的速度提高约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)与手动搜索相当,至少对于非常大的字符串.
使用正则表达式(\ 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); }