什么';这是从c#中的字符串中提取5位数的最快方法
本文关键字:5位 提取 方法 字符串 什么 | 更新日期: 2023-09-27 17:48:48
从c#中的字符串中提取5位数的最快方法是什么。
我有
string.Join(null, System.Text.RegularExpressions.Regex.Split(expression, "[^''d]"));
还有其他的吗?
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();
}