myfinename_slice_1.tif
myfilename_slice_2.tif
...
...
myfilename_slice_15.tif
...
...
myfilename_slice_210.tif
在C#中,如何获得文件索引,如“1”,“2”,“15”,“210”使用字符串操作?C#字符串操作。获取文件名子字符串
myfinename_slice_1.tif
myfilename_slice_2.tif
...
...
myfilename_slice_15.tif
...
...
myfilename_slice_210.tif
在C#中,如何获得文件索引,如“1”,“2”,“15”,“210”使用字符串操作?C#字符串操作。获取文件名子字符串
你有一些选择:
Regex
类正则表达式;String.Split
。最重要的是你可以对文件名的格式做出什么假设。
例如,如果它总是在文件名的末尾,不计扩展和下划线后,你可以这样做:
var id = Path.GetFileNameWithoutExtension("myfinename_slice_1.tif")
.Split('_')
.Last();
Console.WriteLine(id);
例如,如果你可以假设标识符是保证出现在文件名和[0-9]
只允许在文件名显示为标识符的一部分的字符,你可以这样做:
var id = Regex.Match("myfinename_slice_1.tif", @"\d+").Value;
Console.WriteLine(id);
可能有更多的方式来做到这一点,但最重要的是要断言哪些假设你可以制作并编码基于它们的实现。
您可以使用正则表达式"(?<digits>\d+)\.[^\.]+$"
,如果这是一个比赛,你要查找的字符串是一个名为组中的“数字”
String.Split('_')[2].Split('.')[0]
你是指'[2]'? –
这看起来像正则表达式的工作。首先将模式定义为正则表达式:
.*?_(?<index>\d+)\.tif
然后获得对您的字符串的匹配。命名index
该组将包含数字:
var idx = Regex.Match(filename, @".*?_(?<index>\d+)\.tif").Groups["index"].Value;
这里是将处理的方法:
公众诠释GetFileIndex(字符串argFilename) { 回报Int32.Parse(argFilename.Substring(argFilename。 LastIndexOf(“_”)+ 1,argFilename.LastIndexOf(“。”))); }
享受
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var s1 = "myfinename_slice_1.tif";
var s2 = "myfilename_slice_2.tif";
var s3 = "myfilename_slice_15.tif";
var s4 = "myfilename_slice_210.tif";
var s5 = "myfilena44me_slice_210.tif";
var s6 = "7myfilena44me_slice_210.tif";
var s7 = "tif999";
Assert.AreEqual(1, EnumerateNumbers(s1).First());
Assert.AreEqual(2, EnumerateNumbers(s2).First());
Assert.AreEqual(15, EnumerateNumbers(s3).First());
Assert.AreEqual(210, EnumerateNumbers(s4).First());
Assert.AreEqual(210, EnumerateNumbers(s5).Skip(1).First());
Assert.AreEqual(210, EnumerateNumbers(s6).Skip(2).First());
Assert.AreEqual(44, EnumerateNumbers(s6).Skip(1).First());
Assert.AreEqual(999, EnumerateNumbers(s7).First());
}
static IEnumerable<int> EnumerateNumbers(string input)
{
var digits = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
string result = string.Empty;
foreach (var c in input.ToCharArray())
{
if (!digits.Contains(c))
{
if (!string.IsNullOrEmpty(result))
{
yield return int.Parse(result);
result = string.Empty;
}
}
else
{
result += c;
}
}
if (result.Length > 0)
yield return int.Parse(result);
}
}
描述您的参数。数字总是出现在文件名的末尾,在文件扩展名之前,出现在下划线之后? –
@micheal,是的,数字总是出现在扩展之前,以及在slice_之后,但可能是1位数字或2或3位数字。 –