myfinename_slice_1.tif
myfilename_slice_2.tif
...
...
myfilename_slice_15.tif
...
...
myfilename_slice_210.tif
在C#中,如何使用字符串操作获取文件索引,如“1”,“2”,“15”,“210”?
答案 0 :(得分:5)
你有一些选择:
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);
可能有更多的方法可以做到这一点,但最重要的是断言你可以做出哪些假设,然后根据它们编写实现。
答案 1 :(得分:2)
这看起来像正则表达式的工作。首先将模式定义为正则表达式:
.*?_(?<index>\d+)\.tif
然后匹配你的字符串。名为index
的组将包含数字:
var idx = Regex.Match(filename, @".*?_(?<index>\d+)\.tif").Groups["index"].Value;
答案 2 :(得分:1)
您可以使用正则表达式"(?<digits>\d+)\.[^\.]+$"
,如果匹配,您要查找的字符串位于名为“digits”的组中
答案 3 :(得分:1)
以下是处理该问题的方法:
public int GetFileIndex(string argFilename) { 返回Int32.Parse(argFilename.Substring(argFilename.LastIndexOf(“_”)+ 1,argFilename.LastIndexOf(“。”))); }
享受
答案 4 :(得分:0)
String.Split('_')[2].Split('.')[0]
答案 5 :(得分:0)
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);
}
}