我有一个遵循以下模式的文件路径:
一些\文件\路径\基地\ YYYY \ MM \ DD \ HH \毫米\ Random8.3
我想从2012年及以后提取所有内容,但问题是虽然右侧是标准的,但每个记录的基本目录可能不同。
以下是两个例子:
C:\ TEMP \ X \ 2012 \ 08 \ 27 \ 18 \ 35 \ wy32dm1q.qyt
退货:2012\08\27\18\35\wy32dm1q.qyt
d:\ TEMP \ X \ Y \ 2012 \ 08 \ 27 \ 18 \ 36 \ tx84uwvr.puq
退货:2012\08\27\18\36\tx84uwvr.puq
现在我正在抓取LastIndexOf(Path.DirectorySeparatorChar)
N次,以便在2012之前获得字符串的索引,然后从该索引获取子字符串。但是,我有一种感觉,也许还有更好的方法吗?
答案 0 :(得分: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());
}
答案 1 :(得分: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;
}
}
答案 2 :(得分:0)
c#解决方案将是
string str = @"C:\Temp\X\2012\08\27\18\35\wy32dm1q.qyt";
string[] arr=str.Substring(str.IndexOf("2012")).Split(new char[]{'\\'});
答案 3 :(得分: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)。更容易调试/维护,可能是正则表达式变体的两倍。