2

我有一个遵循以下模式的文件路径:

Some\File\Path\Base\yyyy\MM\dd\HH\mm\Random8.3

我想提取 2012 年及以后的所有内容,但问题是虽然右侧是标准的,但每条记录的基本目录可能不同。

这里有两个例子:

  1. C:\Temp\X\2012\08\27\18\35\wy32dm1q.qyt
    返回:2012\08\27\18\35\wy32dm1q.qyt

  2. D:\Temp\X\Y\2012\08\27\18\36\tx84uwvr.puq
    返回:2012\08\27\18\36\tx84uwvr.puq

现在我正在抓取LastIndexOf(Path.DirectorySeparatorChar)N 次以在 2012 年之前获取字符串的索引,然后从该索引获取子字符串。但是,我有一种感觉,也许有更好的方法?

4

4 回答 4

4
    static void Main(string[] args)
    {
        Console.WriteLine(GetLastParts(@"D:\Temp\X\Y\2012\08\27\18\36\tx84uwvr.puq", @"\", 6));
        Console.ReadLine();
    }

    static string GetLastParts(string text, string separator, int count)
    {
        string[] parts = text.Split(new string[] { separator }, StringSplitOptions.None);
        return string.Join(separator, parts.Skip(parts.Count() - count).Take(count).ToArray());
    }
于 2012-08-30T15:18:18.307 回答
3

这是一个使用正则表达式的解决方案,假设您要查找的格式始终包含 \yyyy\MM\dd\HH\mm。

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(ExtractPath(@"C:\Temp\X\2012\08\27\18\35\wy32dm1q.qyt"));
        Console.WriteLine(ExtractPath(@"D:\Temp\X\Y\2012\08\27\18\36\tx84uwvr.puq"));
    }

    static string ExtractPath(string fullPath)
    {
        string regexconvention = String.Format(@"\d{{4}}\u{0:X4}(\d{{2}}\u{0:X4}){{4}}\w{{8}}.\w{{3}}", Convert.ToInt32(Path.DirectorySeparatorChar, CultureInfo.InvariantCulture));

        return Regex.Match(fullPath, regexconvention).Value;
    }
}
于 2012-08-30T15:29:08.803 回答
0

一个 c# 解决方案是

string str = @"C:\Temp\X\2012\08\27\18\35\wy32dm1q.qyt";
string[] arr=str.Substring(str.IndexOf("2012")).Split(new char[]{'\\'});
于 2012-08-30T15:14:52.893 回答
0

我认为您当前的方法没有任何问题。这可能是最适合这份工作的。

public string GetFilepath(int nth, string needle, string haystack) {
    int lastindex = haystack.Length;

    for (int i=nth; i>=0; i--)
        lastindex = haystack.LastIndexOf(needle, lastindex-1);

    return haystack.Substring(lastindex);
}

我会保持简单(KISS)。更容易调试/维护,可能是正则表达式变体的两倍。

于 2012-08-30T15:29:42.127 回答