C# 从不带正则表达式的字符串中获取数字集

C# 从不带正则表达式的字符串中获取数字集,c#,string,substring,C#,String,Substring,当前可以使用regex执行此操作 "abc_d1.txt" should get 0 "abc_d1_2.txt" should get 2 "abc_d1_14.txt" should get 14 "abc_d12_x2_156.txt" should get 156 int-Id; string pattern=@”(?我不确定您为什么不想使用regex(我不判断)。但是,假设一切都与您描述的完全一样,您不需

当前可以使用regex执行此操作

"abc_d1.txt" should get 0
"abc_d1_2.txt" should get 2
"abc_d1_14.txt" should get 14
"abc_d12_x2_156.txt" should get 156
int-Id;

string pattern=@”(?我不确定您为什么不想使用regex(我不判断)。但是,假设一切都与您描述的完全一样,您不需要验证。一种低技术方法是只
拆分字符串,
TryParse
结果,然后调用
LastOrDefault

给定的

 int Id;
 string pattern = @"(?<=_)\d+(?=\.\w+)|(?<!_\d+)(?=\.\w+)";
 Regex rg = new Regex(pattern);
 var z = rg.Match(fullFileName).Value;
 Id = z == "" ? 0 : Convert.ToInt32(z);
用法

private static int GetNumber(string input)
  => input.Split('_','.')
      .Select(x => int.TryParse(x, out var value) ? value : (int?)null)
      .LastOrDefault(x => x != null) ?? 0;

经典字符串操作:

0
2
14
156
(在评论之后)-我猜5是一个“神奇的数字”-它是扩展名“.txt”4加1的长度,以抵消u短一个索引的影响(因为它指向下划线的位置,而不是后面数字的第一个字符的位置)。我可以编写
s.Substring(u+1,s.长度-(u+1)-4
,但这种形式可以更好地自我解释:

int u = s.LastIndexOf('_');
return  int.TryParse(s.Substring(u + 1, s.Length - u - 5), out int i) ? i : 0;

你可以迭代这个字符串,一旦你找到一个
检查下一个字符是否是一个数字。如果是,继续读到下一个非数字。如果你有正则表达式,避免它的理由是什么?只是好奇。
s.Length-u-5
这个
-5
来自
.txt
+1的长度,对吗?giv的最后索引是下划线的索引,但您需要后面的字符。我想我可以说
int u=s.LastIndexOf(“'''+1
),然后计算将是
s.Substring(u,s.Length-u-4)
甚至
s.Substring(u,s.Length-u-.txt.Length)
)我宁愿考虑使用
intd=s.LastIndexOf('.');
s.Substring(u+1,d-u-1)
,以确保它需要任何扩展长度。新年快乐!是的,这也行。我只是想象你有十亿个这样的东西,并且能够轻松避免对字符串进行另一次搜索操作来查找
(当其位置固定/可以计算时)这可能是一种改进。我想说,在可读性和性能之间取得任何平衡都是必要的。与使用正则表达式解析字符串或将其拆分为字符串数组(其中大部分将被丢弃)所付出的努力/cpu/内存相比,这种方法无疑是一种改进
int u = s.LastIndexOf('_');
return  int.TryParse(s.Substring(u + 1, s.Length - u - 5), out int i) ? i : 0;
int begin = s.LastIndexOf('_') + 1;
return  int.TryParse(s.Substring(begin, s.Length - begin - 4), out int i) ? i : 0;