C# 如何解析字符串以匹配c中的模式#
我需要为文件路径列表中的每个项捕获一个子字符串。我循环使用的列表在文件系统中不存在,因此我无法使用Path类。我想从字符串的末尾开始解析,并在到达第一个“/”时停止。我尝试了.Substring()和.Split(),但这两个方法似乎都不能匹配指定的模式或从右向左读取 示例:某些目录/某些子目录/SomeFile.pdf 我想捕获“SomeFile.pdf”您应该改用该类 例如:C# 如何解析字符串以匹配c中的模式#,c#,string,parsing,C#,String,Parsing,我需要为文件路径列表中的每个项捕获一个子字符串。我循环使用的列表在文件系统中不存在,因此我无法使用Path类。我想从字符串的末尾开始解析,并在到达第一个“/”时停止。我尝试了.Substring()和.Split(),但这两个方法似乎都不能匹配指定的模式或从右向左读取 示例:某些目录/某些子目录/SomeFile.pdf 我想捕获“SomeFile.pdf”您应该改用该类 例如: string path = "Some Directory/Some SubDirectory/SomeFile.p
string path = "Some Directory/Some SubDirectory/SomeFile.pdf";
string fileName = System.IO.Path.GetFileName(path);
编辑:仅回答您的原始问题“如何从右向左阅读”:
您可以使用:
(但是,如果使用路径,请使用Path
类)
使用Path类是最简单、最正确和安全的方法。但是,如果您希望从字符串的末尾或从右向左进行分析,一种方法是反转字符串并对其进行分析
反转字符串,搜索“/”,获取子字符串,反转您的子字符串,您就得到了您要查找的内容
示例:使用您的路径调用GetFileNameFromPath方法,它将打印SomeFile.pdf
using System;
public class Test
{
public static void Main()
{
string path = "Some Directory/Some SubDirectory/SomeFile.pdf";
string fileName = GetFileNameFromPath(path);
Console.WriteLine(fileName);
}
public static string GetFileNameFromPath(string path)
{
string fileName = string.Empty;
path = path.ReverseString();
fileName = path.Substring(0, path.IndexOf(@"/"));
fileName = fileName.ReverseString();
return fileName;
}
}
public static class StringExtension
{
public static string ReverseString(this string s)
{
char[] arr = s.ToCharArray();
Array.Reverse(arr);
return new string(arr);
}
}
如果您实际将路径视为文件/文件夹信息,则最好使用路径,但如果您将其视为恰好要在“/”处拆分的字符串,则可以拆分,然后反转:
string str = "Some Directory/Some SubDirectory/SomeFile.pdf";
string[] terms = str.Split('/');
Array.Reverse(terms);
foreach (string term in terms)
{
Console.WriteLine(term);
}
Path是.NET中使用率最低的一个类。每个人都认为他们应该自己做这种解析。@Cemafor我不知道路径。组合了很长一段时间。不过,我希望我能这么做。如果你打算这样做,只使用linq并执行
path.Split('/').Last()
?如果从.NET 1.1开始就有现成的,为什么要尝试实现一个低效的GetFileNameFromFullPath
?是的,这会更容易,我只是复制了一些关于这个主题的旧代码。因为这个问题没有说明.NET framework的版本,所以提出LINQ会更容易。@TimSchmelter我完全同意,但我认为他只是试图给出一个次要的解决方案,因为这个问题的提问方式。像回答如何从z~ads~fsajlkfs~rasdo~a-b中提取a-b?
,GetFileName在这方面没有帮助。@NickFreeman:我编辑了我的答案来回答他最初的问题。我认为子字符串(LastIndexOf(“/”)
是最有效但不安全的方法。这打印:SomeFile.pdf
一些子目录
一些目录
不是要求的。对不起,是的。我误读了这句话:“我需要为文件路径列表中的每个项目捕获一个子字符串。”(此外,使用PathSeparator也同样简单。)
using System;
public class Test
{
public static void Main()
{
string path = "Some Directory/Some SubDirectory/SomeFile.pdf";
string fileName = GetFileNameFromPath(path);
Console.WriteLine(fileName);
}
public static string GetFileNameFromPath(string path)
{
string fileName = string.Empty;
path = path.ReverseString();
fileName = path.Substring(0, path.IndexOf(@"/"));
fileName = fileName.ReverseString();
return fileName;
}
}
public static class StringExtension
{
public static string ReverseString(this string s)
{
char[] arr = s.ToCharArray();
Array.Reverse(arr);
return new string(arr);
}
}
string str = "Some Directory/Some SubDirectory/SomeFile.pdf";
string[] terms = str.Split('/');
Array.Reverse(terms);
foreach (string term in terms)
{
Console.WriteLine(term);
}