Подтвердить что ты не робот

Parse filename из полного пути с использованием регулярных выражений в С#

Как вытащить имя файла из полного пути, используя регулярные выражения в С#?

Скажем, у меня есть полный путь C:\CoolDirectory\CoolSubdirectory\CoolFile.txt.

Как мне получить CoolFile.txt с использованием .NET-выражения регулярных выражений? Я не очень хорошо разбираюсь в регулярных выражениях, и мой приятель RegEx и я не могли понять этого.

Кроме того, в процессе попытки решить эту проблему, я понял, что могу просто использовать System.IO.Path.GetFileName, но тот факт, что я не мог понять регулярное выражение, просто делает меня несчастным, и это будет беспокоить меня пока я не знаю, что такое ответ.

4b9b3361

Ответ 1

//  using System.Text.RegularExpressions;

/// <summary>
///  Regular expression built for C# on: Tue, Oct 21, 2008, 02:34:30 PM
///  Using Expresso Version: 3.0.2766, http://www.ultrapico.com
///  
///  A description of the regular expression:
///  
///  Any character that is NOT in this class: [\\], any number of repetitions
///  End of line or string
///  
///
/// </summary>
public static Regex regex = new Regex(
      @"[^\\]*$",
    RegexOptions.IgnoreCase
    | RegexOptions.CultureInvariant
    | RegexOptions.IgnorePatternWhitespace
    | RegexOptions.Compiled
    );

UPDATE: удалена начальная косая черта

Ответ 2

Почему вы должны использовать регулярные выражения?.NET имеет встроенный метод Path.GetFileName() специально для этого, который работает на разных платформах и файловых системах.

Ответ 3

Здесь один подход:

string filename = Regex.Match(filename, @".*\\([^\\]+$)").Groups[1].Value;

В основном, он соответствует всем между последней обратной косой чертой и концом строки. Конечно, как вы уже упоминали, использование Path.GetFileName() намного проще и будет обрабатывать множество краевых случаев, которые являются болью для обработки регулярным выражением.

Ответ 4

Короче:

string filename = Regex.Match(fullpath, @"[^\\]*$").Value;

Или:

string filename = Regex.Match(fullpath, "[^\\"+System.IO.Path.PathSeparator+"]*$").Value;

Без Regex:

string[] pathparts = fullpath.Split(new []{System.IO.Path.PathSeparator});
string file = pathparts[pathparts.Length-1];

Официальную поддержку библиотеки вы упомянули:

string file = System.IO.Path.GetFileName(fullpath);

Ответ 5

\w+:\\(\w+\\)*(?<file>\w*\.\w*)

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

Ответ 6

Вы должны использовать класс System.Path. Это будет означать, что вам придется беспокоиться о меньшем, если вы когда-нибудь решите поддержать Mono/Linux (пример dlamblin учитывает разделитель пути, но вы можете получить странную ОС с необычными путями). Класс System.Path также может комбинировать два пути в одном. Так, например:

Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "My App Stuff");

будет разрешено:

  • Windows: C:\Documents and Settings\[User]\Мои документы\Мои приложения
  • Linux:/[Пользователь]/Мои приложения