1

我正在尝试解析日期格式的文件名,例如

C:\Documents/<yyyy>\<MMM>\Example_CSV_<ddMM>.csv

并返回“今天”文件名。

因此,对于上面的示例,我将返回(2013 年 8 月 9 日)C:\Documents\2013\Aug\Example_CSV_0908.csv

我想知道 Regex 是否会起作用,但我只是对如何处理它有一个心理障碍!

我不能只用日期替换第 x 到第 y 部分,因为我将处理的文件存储在系统各处的不同文件夹中(不是我的想法)。所有日期代码都将包含在 <> 但是,据我所知,我不能做类似的事情

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

非常感谢您的帮助!

4

3 回答 3

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

于 2013-08-09T13:46:35.527 回答
0

你可以做什么(虽然我无法想象这是一个真实的场景,但这可能是我缺乏形象化是以下正则表达式;

<([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;
}
于 2013-08-09T13:34:34.507 回答
0
var path = new Regex("<([dMy]+)>").Replace(pathFormat, o => DateTime.Now.ToString(o.Groups[1].Value));

注意:在方括号内添加所有可能出现的字母/符号。

Nb2:但这不会限制奇怪的 DateTime 字符串。如果你想确保统一的格式,你可以像这样制作一个更具限制性的正则表达式:

var path = new Regex("<(ddMM)|(MMM)|(yyyy)>").Replace(pathFormat, o => DateTime.Now.ToString(o.Groups[1].Value));

编辑:一定要爱单线:)

于 2013-08-09T13:46:12.117 回答