C# 替换字符串的日期代码部分
我正在尝试解析一个日期格式的文件名,例如C# 替换字符串的日期代码部分,c#,.net,datetime,C#,.net,Datetime,我正在尝试解析一个日期格式的文件名,例如 C:\Documents/<yyyy>\<MMM>\Example_CSV_<ddMM>.csv 另外,如果普通文件名的一部分可以解释为日期代码,我想这会产生意想不到的后果 如果有人能给我一个指向正确方向的指针,那就太好了。如果您需要更多的上下文,下面是包含此方法的类: public class ImportSetting { public string ID { get; private s
C:\Documents/<yyyy>\<MMM>\Example_CSV_<ddMM>.csv
另外,如果普通文件名的一部分可以解释为日期代码,我想这会产生意想不到的后果
如果有人能给我一个指向正确方向的指针,那就太好了。如果您需要更多的上下文,下面是包含此方法的类:
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>();
}
}
公共类导入设置
{
公共字符串ID{get;private set;}
公共列表映射{get;set;}
公共字符串文件名{get;set;}
公共字符串GetFileName()
{
字符串ToFormat=RawFileName;//例如C:\Documents/\\Example\u CSV\u.CSV
//做一些聪明的事情。
return to format;//C:\Documents\2013\Aug\Example\u CSV\u 0908.CSV
}
public int GetCSVColumn(string AttributeName){返回映射。第一个(x=>x.AttributeName==AttributeName).ColumnID;}
公共导入设置(字符串名称)
{
ID=名称;
映射=新列表();
}
}
非常感谢你的帮助 你能做什么(虽然我不能想象这是一个真实的场景,但那可能是我缺乏的想象)下面的正则表达式
<([fdDmMyYs]+?)>
这将为您提供<和>符号内的任何匹配,尽可能短,以便在测试中返回
然后去掉第一个和最后一个符号,或者使用一些更奇特的正则表达式函数来完成这项工作
然后只需使用DateTime.Now.ToString(RegexMatchWithout 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;
}
公共字符串GetFileName(字符串文件名)
{
Regex Regex=新的Regex(@“”);
foreach(在regex.Matches中匹配m(文件名))
{
fileName=fileName.Replace(m.Value,DateTime.Now.ToString(m.Value.Substring(1,m.Value.Length-2));
}
返回文件名;
}
var path=new Regex(“”).Replace(pathFormat,o=>DateTime.Now.ToString(o.Groups[1].Value));
注意:添加方括号内可能出现的所有字母/符号
Nb2:但这不会限制奇怪的日期时间字符串。如果要确保格式统一,可以使用更严格的正则表达式,如下所示:
var path = new Regex("<(ddMM)|(MMM)|(yyyy)>").Replace(pathFormat, o => DateTime.Now.ToString(o.Groups[1].Value));
var path=new Regex(“”).Replace(pathFormat,o=>DateTime.Now.ToString(o.Groups[1].Value));
编辑:必须喜欢一行:)不需要替换文本中的任何内容,因为您可以使用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\u CSV\u 0908.CSV
任何您不想被解析为日期的内容,都可以用单引号“
将其解析为字符串文字。可以在这里找到日期格式字符串的完整列表:谢谢,这正是我要找的类型!唯一的问题是,虽然它拾取了所有需要匹配的表达式,但它并不能替换任何东西…?输入了一个愚蠢的错误,不应该对我未经测试的代码感到如此自信。但是,最好使用StringBuilder,而不是每次都初始化一个新字符串。这是功能代码,但还有改进的余地。你是个天才。希望我能够在用户输入文件名并将其保存到XML文件时,而不是在我读回文件时,防止出现错误,从而限制错误。出于兴趣,什么样的日期时间字符串会导致异常?一行程序根本不会导致异常。他指的是用户输入dMdM之类的东西,这不是一个正确的序列。是的,我只是出于本能说的。但这不会导致例外。我正在编辑答案,因为我们还将regex改为类似的东西,因为它允许用户喜欢的日期字母。但是你在你的第一个Nb中已经提到了这一点。@F.B.tenKate为什么要打问号?这不会使格式字符串位于<>选项中吗?你为什么要那样?此外,您在格式字符串中丢失了更多内容,如时间分隔符等。这就是为什么我没有费心做一个完整的清单。我把它交给了那些想用它来选择他允许的东西的人谢谢你的建议,马特!我不知道我怎么漏掉了文字字符串分隔符!我已经更新了我的答案以包含文字字符串分隔符。我还是要避开反斜杠,因为这是特殊情况。现在看起来好多了。我认为反斜杠可以放在引号的内部或外部,并且会以同样的方式工作。干杯
var path = new Regex("<(ddMM)|(MMM)|(yyyy)>").Replace(pathFormat, o => DateTime.Now.ToString(o.Groups[1].Value));
public string GetFileName(DateTime date)
{
string format = @"'C:\\Documents'\\yyyy\\MMM'\\Example_CSV_'ddMM'.csv'";
return date.ToString(format);
}