在 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:(?<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\[用户]\My Documents\My App Stuff Linux:/[用户]/我的应用程序【讨论】:
以上是关于在 C# 中使用正则表达式从完整路径解析文件名的主要内容,如果未能解决你的问题,请参考以下文章