C#字符串操作。获取文件名子字符串

时间:2011-11-04 17:36:42

标签: c#

myfinename_slice_1.tif
myfilename_slice_2.tif
...
...
myfilename_slice_15.tif
...
...
myfilename_slice_210.tif

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

6 个答案:

答案 0 :(得分: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 :(得分: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);
    }
}