2011-11-04 132 views
3
myfinename_slice_1.tif 
myfilename_slice_2.tif 
... 
... 
myfilename_slice_15.tif 
... 
... 
myfilename_slice_210.tif 

在C#中,如何获得文件索引,如“1”,“2”,“15”,“210”使用字符串操作?C#字符串操作。获取文件名子字符串

+0

描述您的参数。数字总是出现在文件名的末尾,在文件扩展名之前,出现在下划线之后? –

+0

@micheal,是的,数字总是出现在扩展之前,以及在slice_之后,但可能是1位数字或2或3位数字。 –

回答

5

你有一些选择:

最重要的是你可以对文件名的格式做出什么假设。

例如,如果它总是在文件名的末尾,不计扩展和下划线后,你可以这样做:

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

您可以使用正则表达式"(?<digits>\d+)\.[^\.]+$",如果这是一个比赛,你要查找的字符串是一个名为组中的“数字”

0
String.Split('_')[2].Split('.')[0] 
+0

你是指'[2]'? –

2

这看起来像正则表达式的工作。首先将模式定义为正则表达式:

.*?_(?<index>\d+)\.tif 

然后获得对您的字符串的匹配。命名index该组将包含数字:

var idx = Regex.Match(filename, @".*?_(?<index>\d+)\.tif").Groups["index"].Value; 
1

这里是将处理的方法:

公众诠释GetFileIndex(字符串argFilename) { 回报Int32.Parse(argFilename.Substring(argFilename。 LastIndexOf(“_”)+ 1,argFilename.LastIndexOf(“。”))); }

享受

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); 
    } 
}