在 C# 中使用正则表达式从完整路径解析文件名

Posted

技术标签:

【中文标题】在 C# 中使用正则表达式从完整路径解析文件名【英文标题】:Parse filename from full path using regular expressions in C# 【发布时间】:2010-09-18 09:35:34 【问题描述】:

如何在 C# 中使用正则表达式从完整路径中提取文件名?

假设我有完整路径C:\CoolDirectory\CoolSubdirectory\CoolFile.txt

如何使用 .NET 风格的正则表达式获取 CoolFile.txt?我不太擅长正则表达式,我和我的 RegEx 伙伴都想不通。

另外,在尝试解决这个问题的过程中,我意识到我可以使用System.IO.Path.GetFileName,但是我无法弄清楚正则表达式的事实只是让我不开心,它会困扰我直到我知道答案是什么。

【问题讨论】:

您想知道它如何使用正则表达式很好,但是为了让这个世界变得更美好,请保证您将使用 Path.* 无论如何: ) GetFileName 如果您使用的是Long Path,则可能不是一个选项 支持和反对正则表达式的理由:codinghorror.com/blog/2008/06/… 【参考方案1】:

为什么必须使用正则表达式? .NET 具有专门用于此的内置 Path.GetFileName() 方法,该方法适用于跨平台和文件系统。

【讨论】:

您没有仔细阅读问题。他知道 GetFileName(),但想知道如何使用 reg ex. 当我发布我的答案时,那句话不存在。 那你就别理我了。 :)【参考方案2】:
//  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
    );

更新:删除了开头的斜线

【讨论】:

你意识到这将得到“\CoolFile.txt” 很好,我没想到在测试时斜线不应该在那里【参考方案3】:

这是一种方法:

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

基本上,它匹配最后一个反斜杠和字符串末尾之间的所有内容。当然,正如您所提到的,使用 Path.GetFileName() 要容易得多,并且可以处理许多使用正则表达式难以处理的边缘情况。

【讨论】:

+1 因为我能够用它解决 Perl 正则表达式问题。谢谢。【参考方案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*)

这显然需要扩展以覆盖所有路径字符,但命名组“文件”包含给定示例路径的文件名。

【讨论】:

只是好奇,下一组是做什么的? (?\w*\.\w*)。应该是 (?:) @Artu: (?&lt;file&gt;\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\[用户]\My Documents\My App Stuff Linux:/[用户]/我的应用程序

【讨论】:

以上是关于在 C# 中使用正则表达式从完整路径解析文件名的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中使用正则表达式解析重复的名称-值对

用于提取部分文件路径的正则表达式

使用正则表达式从 C# 中的 SQL 语句中查找 SQL 函数

正则表达式和相对文件路径

使用正则表达式 C# 解析字幕文件

从给定字符串中提取 url 的 C# 正则表达式模式 - 不是完整的 html url,而是裸链接