2011-11-04 170 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); 
    } 
}