我正在尝试解析日期格式的文件名,例如
C:\Documents/<yyyy>\<MMM>\Example_CSV_<ddMM>.csv
并返回“Todays”文件名。
所以对于上面的例子,我会回来(2013年8月9日), C:\文件\ 2013 \八月\ Example_CSV_0908.csv
我想知道Regex是否会起作用,但我只是想知道如何处理它!
我不能只用日期替换第x个到第y个部分,因为我要处理的文件存储在整个系统的不同文件夹中(不是我的想法)。所有日期代码都将包含在&lt;&gt;中但是,据我所知,我不能做像
这样的事情Return DateTime.Today.ToString(RawFileName);
另外我想如果普通文件名的一部分可以被解释为日期代码会产生意想不到的后果!
如果有人能给我一个指向正确方向的指针,那就太好了。如果你需要更多的上下文,这里是包含这个方法的类:
public class ImportSetting
{
public string ID { get; private set; }
public List<ImportMapping> Mappings { get; set; }
public string RawFileName { get; set; }
public string GetFileName()
{
string ToFormat = RawFileName; //e.g. C:\Documents/<yyyy>\<MMM>\Example_CSV_<ddMM>.csv
//Do some clever stuff.
return ToFormat; //C:\Documents\2013\Aug\Example_CSV_0908.csv
}
public int GetCSVColumn(string AttributeName) { return Mappings.First(x => x.Attribute == AttributeName).ColumnID; }
public ImportSetting(string Name)
{
ID = Name;
Mappings = new List<ImportMapping>();
}
}
非常感谢你的帮助!
答案 0 :(得分:2)
无需替换文本中的任何内容,因为您可以将Date.ToString()方法与格式字符串一起使用,如下所示:
public string GetFileName(DateTime date)
{
string format = @"'C:\\Documents'\\yyyy\\MMM'\\Example_CSV_'ddMM'.csv'";
return date.ToString(format);
}
使用今天的日期调用GetFileName:
Console.WriteLine(GetFileName(DateTime.Now));
输出:
C:\Documents\2013\Aug\Example_CSV_0908.csv
您不希望将任何内容解析为日期,请使用单引号'
将其解析为字符串文字。可以在此处找到日期格式字符串的完整列表:http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
答案 1 :(得分:0)
你可以做什么(虽然我无法想象这是一个真实的场景,但可能是我缺乏图像是以下正则表达式;
<([fdDmMyYs]+?)>
这将为您提供&lt;和&gt;符号,尽可能短,所以在测试中它返回了;
然后剥离第一个和最后一个符号,或使用一些更高级的正则表达式函数为您执行此操作。
然后只使用DateTime.Now.ToString(RegexMatchWithout&lt;&gt; here)
用输出替换匹配。
所以一个代码示例(未经测试,但我感到自信;-))将是:
public string GetFileName(string fileName)
{
Regex regex = new Regex(@"<([fdDmMyYs]+?)>");
foreach(Match m in regex.Matches(fileName))
{
fileName = fileName.Replace(m.Value, DateTime.Now.ToString(m.Value.Substring(1, m.Value.Length - 2)));
}
return fileName;
}
答案 2 :(得分:0)
var path = new Regex("<([dMy]+)>").Replace(pathFormat, o => DateTime.Now.ToString(o.Groups[1].Value));
Nb:添加方括号内可能出现的所有可能的字母/符号。
Nb2:但是这不会限制奇怪的DateTime字符串。如果你想确保一个统一的格式,你可以制作一个更严格的正则表达式:
var path = new Regex("<(ddMM)|(MMM)|(yyyy)>").Replace(pathFormat, o => DateTime.Now.ToString(o.Groups[1].Value));
编辑:得爱一线:)