4

我有以下数据:

D:\toto\food\Cloture_49000ert1_10_01_2013.pdf
D:\toto\food\Cloture_856589_12_01_2013.pdf
D:\toto\food\Cloture_66rr5254_10_12_2012.pdf

如何提取日期部分?例如:

D:\toto\food\Cloture_49000ert1_10_01_2013.pdf --> 10_01_2013
D:\toto\food\Cloture_856589_12_01_2013.pdf --> 12_01_2013
D:\toto\food\Cloture_66rr5254_10_12_2012.pdf --> 10_12_2012

我的想法是使用LastIndexOf(".pdf") 然后倒数 10 个字符。

如何使用子字符串或其他方法解决此问题?

4

7 回答 7

6

Substring在这种情况下使用。

从此实例中检索子字符串。子字符串从指定的字符位置开始。

试试这样;

string s = "D:\\toto\\food\\Cloture_490001_10_01_2013.pdf";
string newstring = s.Substring(s.Length - 14, 10);
Console.WriteLine(newstring);

这是一个DEMO.

于 2013-01-15T12:53:57.803 回答
4

你不需要找到索引.pdf

path.Substring(path.Length - 14, 10)
于 2013-01-15T12:52:24.563 回答
3

我会用正则表达式来做到这一点。

^[\w:\\]+cloture_(\d+)_([\d_]+).pdf$

将匹配第二组中的日期。

于 2013-01-15T12:54:32.933 回答
2

如果文件名始终采用该格式,您可以执行如下粗略的操作:

string filename = @"D:\toto\food\Cloture_490001_10_01_2013.pdf";

string date = filename.Substring(filename.Length - 14, 10);

这将从 中得到一个子字符串10_01_2013.pdf,它有 14 个字符长,但只取第一个10字符,留下10_01_2013.

但是,如果文件名采用不同的格式并且日期可能出现在名称中的任何位置,您可能需要考虑使用正则表达式之类的东西来进行匹配##_##_####并将其提取出来。

于 2013-01-15T12:52:43.110 回答
0

试试这个方法:

string dateString = textString.Substring(textString.Length-14, 10);

也见这里:只从字符串中提取最右边的 n 个字母

于 2013-01-15T12:52:20.267 回答
0

如果你想使用 LastIndexOf 那么

string str = @"D:\toto\food\Cloture_490001_10_01_2013.pdf";
string temp = str.Substring(str.LastIndexOf(".pdf") - 10, 10);

你可以像这样解析它

DateTime dt;
if(DateTime.TryParseExact(temp, "MM_dd_yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
{
    //valid 
}
else
{
    //invalid
}
于 2013-01-15T12:55:39.110 回答
0

我会同意你使用LastIndexOf“.pdf”的想法,然后倒数。或者使用该Path.GetFileNameWithoutExtension方法只获取名称,然后取最后 10 个字符。

如果文件名的路径发生变化(可能会),这些方法都将继续工作,并且不依赖幻数(除了定义我们感兴趣的子字符串长度的那个)来找到正确的位置在字符串中。

于 2013-01-15T12:57:25.283 回答