Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 替换字符串的日期代码部分_C#_.net_Datetime - Fatal编程技术网

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);
}