Parse filename из полного пути с использованием регулярных выражений в С#
Как вытащить имя файла из полного пути, используя регулярные выражения в С#?
Скажем, у меня есть полный путь C:\CoolDirectory\CoolSubdirectory\CoolFile.txt
.
Как мне получить CoolFile.txt с использованием .NET-выражения регулярных выражений? Я не очень хорошо разбираюсь в регулярных выражениях, и мой приятель RegEx и я не могли понять этого.
Кроме того, в процессе попытки решить эту проблему, я понял, что могу просто использовать System.IO.Path.GetFileName
, но тот факт, что я не мог понять регулярное выражение, просто делает меня несчастным, и это будет беспокоить меня пока я не знаю, что такое ответ.
Ответы
Ответ 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:/[Пользователь]/Мои приложения