从没有正则表达式的字符串中获取一组数字
Get set of numbers from string without 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 = @"(?<=_)\d+(?=\.\w+)|(?<!_\d+)(?=\.\w+)";
Regex rg = new Regex(pattern);
var z = rg.Match(fullFileName).Value;
Id = z == "" ? 0 : Convert.ToInt32(z);
但是没有正则表达式怎么办?
我不确定您为什么不想使用正则表达式(我不作判断)。但是,假设一切都与您描述的完全一样,并且您不需要验证。一种低技术含量的方法是 Split
字符串,TryParse
结果,然后调用 LastOrDefault
给定
private static int GetNumber(string input)
=> input.Split('_','.')
.Select(x => int.TryParse(x, out var value) ? value : (int?)null)
.LastOrDefault(x => x != null) ?? 0;
用法
var asd = new List<string>()
{
"abc_d1.txt",
"abc_d1_2.txt",
"abc_d1_14.txt",
"abc_d12_x2_156.txt"
};
foreach (var result in asd.Select(GetNumber))
Console.WriteLine(result);
输出
0
2
14
156
经典字符串操作:
int u = s.LastIndexOf('_');
return int.TryParse(s.Substring(u + 1, s.Length - u - 5), out int i) ? i : 0;
(从评论开始) - 我猜 5 是一个“神奇的数字” - 它是扩展名“.txt”的长度 4 加 1 来抵消你是一个索引短的影响(因为它指向下划线的位置,而不是它后面数字的第一个字符的位置)。我本可以写成 s.Substring(u + 1, s.Length - (u + 1) - 4
,但这种形式可能更好地自我解释:
int begin = s.LastIndexOf('_') + 1;
return int.TryParse(s.Substring(begin, s.Length - begin - 4), out int i) ? i : 0;
"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 = @"(?<=_)\d+(?=\.\w+)|(?<!_\d+)(?=\.\w+)";
Regex rg = new Regex(pattern);
var z = rg.Match(fullFileName).Value;
Id = z == "" ? 0 : Convert.ToInt32(z);
但是没有正则表达式怎么办?
我不确定您为什么不想使用正则表达式(我不作判断)。但是,假设一切都与您描述的完全一样,并且您不需要验证。一种低技术含量的方法是 Split
字符串,TryParse
结果,然后调用 LastOrDefault
给定
private static int GetNumber(string input)
=> input.Split('_','.')
.Select(x => int.TryParse(x, out var value) ? value : (int?)null)
.LastOrDefault(x => x != null) ?? 0;
用法
var asd = new List<string>()
{
"abc_d1.txt",
"abc_d1_2.txt",
"abc_d1_14.txt",
"abc_d12_x2_156.txt"
};
foreach (var result in asd.Select(GetNumber))
Console.WriteLine(result);
输出
0
2
14
156
经典字符串操作:
int u = s.LastIndexOf('_');
return int.TryParse(s.Substring(u + 1, s.Length - u - 5), out int i) ? i : 0;
(从评论开始) - 我猜 5 是一个“神奇的数字” - 它是扩展名“.txt”的长度 4 加 1 来抵消你是一个索引短的影响(因为它指向下划线的位置,而不是它后面数字的第一个字符的位置)。我本可以写成 s.Substring(u + 1, s.Length - (u + 1) - 4
,但这种形式可能更好地自我解释:
int begin = s.LastIndexOf('_') + 1;
return int.TryParse(s.Substring(begin, s.Length - begin - 4), out int i) ? i : 0;