Разделение имени файла с помощью нескольких разделителей

#c# #split #filenames

Вопрос:

Как бы я разделил это имя файла. image-1.png-ad-en-Km-Image.txt так что конечный результат выглядит так. (также игнорировать «.txt » в конце).

  • изображение-1.png
  • реклама
  • en
  • Км
  • Изображение

Другими словами, я хочу проигнорировать первый дефис (-). Первый «сегмент» всегда будет заканчиваться на .png или .jpg.

Обычно я бы сделал это примерно так, но этот первый дефис в названии изображения немного мешает работе.

  var endOfName = name.LastIndexOf(".txt");
 var names = name.Substring(0, endOfName).Split('-');
 

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

1. Разделение принимает массив символов : ввод. Раскол(новый символ[] {‘-‘,’.’}). toArray();

Ответ №1:

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

   using System.IO;

  .. 

  string source = "image-1.png-ad-en-Km-Image.txt";

  // get rid of ".txt"
  string name = Path.GetFileNameWithoutExtension(source);

  // split extension ".png-ad-en-Km-Image" into {".png", "ad", "en", "Km", "Image"}
  string[] items = Path.GetExtension(name).Split('-');

  // Add file name "image-1" to the 1st item
  items[0] = Path.GetFileNameWithoutExtension(name)   items[0];
 

Давайте посмотрим:

   Console.WriteLine(string.Join(Environment.NewLine, items));
 

Исход:

 image-1.png
ad
en
Km
Image
 

Пожалуйста, обратите внимание, что даже для таких имен файлов, как

 string source = "my.image-1-2-3.png-ad-en-Km-Image.txt";
 

у нас будет

 my.image-1-2-3.png # <- valid file name
ad
en
Km
Image 
 

Ответ №2:

Если шаблон имени файла является постоянным, вы можете использовать следующую функцию:

 static List<string> GetNames(string filename)
{
    var segments = filename.Split('.');

    // The second segment contains all the "-" delimited tokens
    // including the extension of the first segment (png/jpg)
    var others = segments[1].Split('-');

    var firstName = $"{segments[0]}.{others.First()}";

    var names = new List<string> { firstName };

    // Add all but the first element, since it's part of firstName
    names.AddRange(others.Skip(1));

    // If you wanted to add the final ".txt", you'd simply:
    // names.Add($".{segments[2]}");

    return names;
}

static void Main()
{
    var filename = "image-1.png-ad-en-Km-Image.txt";
    var names = GetNames(filename); // image-1.png, ad, en, Km, Image
}