Строковая операция C #. получение подстроки имени файла

#c#

#c#

Вопрос:

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

В C #, как я могу получить индекс файла, например «1», «2», «15», «210» используя строковые операции?

Комментарии:

1. Опишите свои параметры. Всегда ли число встречается в конце имени файла, непосредственно перед расширением файла, после символа подчеркивания?

2. @micheal, да, число всегда появляется перед расширением и после среза_, но может быть 1 цифра или 2 или 3 цифры.

Ответ №1:

У вас есть несколько вариантов:

Наиболее важным является то, какие предположения вы можете сделать о формате имени файла.

Например, если она всегда находится в конце имени файла, без учета расширения, и после подчеркивания, вы можете сделать:

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

Вероятно, есть больше способов сделать это, но самое главное — определить, какие предположения вы можете сделать, а затем закодировать реализацию на их основе.

Ответ №2:

Это похоже на задание для регулярных выражений. Сначала определите шаблон как регулярное выражение:

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

Затем получаем совпадение с вашей строкой. Группа с именем index будет содержать цифры:

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

Ответ №3:

Вы можете использовать регулярное выражение "(?<digits>d ).[^.] $" , и если оно совпадает, то искомая строка находится в группе с именем «цифры»

Ответ №4:

Вот метод, который будет обрабатывать это:

public int GetFileIndex(string argFilename) { возвращает Int32.Parse(argFilename.Подстрока (argFilename.lastIndexOf(«_») 1, argFilename.lastIndexOf(«.»))); }

Наслаждайтесь

Ответ №5:

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

Ответ №6:

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