C# 如何解析字符串以匹配c中的模式#

C# 如何解析字符串以匹配c中的模式#,c#,string,parsing,C#,String,Parsing,我需要为文件路径列表中的每个项捕获一个子字符串。我循环使用的列表在文件系统中不存在,因此我无法使用Path类。我想从字符串的末尾开始解析,并在到达第一个“/”时停止。我尝试了.Substring()和.Split(),但这两个方法似乎都不能匹配指定的模式或从右向左读取 示例:某些目录/某些子目录/SomeFile.pdf 我想捕获“SomeFile.pdf”您应该改用该类 例如: string path = "Some Directory/Some SubDirectory/SomeFile.p

我需要为文件路径列表中的每个项捕获一个子字符串。我循环使用的列表在文件系统中不存在,因此我无法使用Path类。我想从字符串的末尾开始解析,并在到达第一个“/”时停止。我尝试了.Substring()和.Split(),但这两个方法似乎都不能匹配指定的模式或从右向左读取

示例:某些目录/某些子目录/SomeFile.pdf

我想捕获“SomeFile.pdf”

您应该改用该类

例如:

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);
}