Разобрать имя файла по полному пути, используя регулярные выражения в C # - PullRequest
19 голосов
/ 21 октября 2008

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

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

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

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

Ответы [ 6 ]

36 голосов
/ 21 октября 2008

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

19 голосов
/ 21 октября 2008
//  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
    );

ОБНОВЛЕНИЕ: удален начальный слеш

7 голосов
/ 21 октября 2008

Вот один из подходов:

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

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

4 голосов
/ 21 октября 2008

Короче:

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);
1 голос
/ 21 октября 2008
\w+:\\(\w+\\)*(?<file>\w*\.\w*)

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

0 голосов
/ 22 октября 2008

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

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

разрешит:

  • Windows: C: \ Documents and Settings \ [Пользователь] \ Мои документы \ My App Stuff
  • Linux: / [Пользователь] / My App Stuff
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...