3

我正在使用正则表达式来匹配文件名中的日期。我想将输出分成几组(我的声明就是这样做的)。

到目前为止,我已经测试了输出,但我似乎无法让我的组值传递给一个字符串,以便我可以使用它们创建目录。事实上,我似乎根本无法获得我的团体价值观。

我知道这可以在没有正则表达式的情况下完成,但我选择以这种方式尝试学习它。我的输入字符串是文件名"Result5_14_20009 1_30_00 PM.xml"

如何创建一个字符串"month",将值传递给第 1 组等?

这是我到目前为止所拥有的:

private void btnSort_Click(object sender, EventArgs e)
{
    string fileName = "Result*.xml";
    string sourcePath = txtSource.Text;
    string targetPath = txtDest.Text;

    //Get Data from Filename
    string[] files = System.IO.Directory.GetFiles(sourcePath);
    Regex date = new Regex(@"([1-9]|[0-2])_(\d{2})_(\d{4})", RegexOptions.CultureInvariant);

    foreach (string s in files)
    {
        Match m = date.Match(s);
        if (m.Success)
        {
            //Pass Groups to String

            //Create Dir for Group 3 (Year) 
            //Create Dir for Group 1 (Month)
            //Create Dir for Group 2 (Day)
        }
    }
}
4

4 回答 4

2

您可以通过 Match.Groups 属性访问组,并通过Group.Value 属性访问组值。要将组值组合到路径中,可以使用Path.Combine 方法。Ant 创建目录,可以使用Directory.CreateDirectory 方法

string path = Path.Combine(
  @"C:\Users\...\Foo", m.Groups[3].Value, m.Groups[1].Value, m.Groups[2].Value);

// path == @"C:\Users\...\Foo\2000\5\14"

Directory.CreateDirectory(path);
于 2013-09-12T20:25:07.630 回答
1

你快到了,你只需要在正则表达式中定义你的组:

Regex date = new Regex(@"(?<MONTH>[1-9]|[0-2])_(?<DAY>\d{2})_(?<YEAR>\d{4})", RegexOptions.CultureInvariant);

foreach(Match oMatch in oMatchCollection) 
{ 

 Console.WriteLine("MONTH: "+oMatch.Groups["MONTH"].Value);
 Console.WriteLine("DAY: "+oMatch.Groups["DAY"].Value); 
 Console.WriteLine("YEAR: "+oMatch.Groups["YEAR"].Value); 
} 
于 2013-09-12T20:25:05.100 回答
1

您正在寻找对象的Groups属性Match。继续你的例子:

if (m.Success)
{
    //groups[0] will be the entire filename
    string year = m.Groups[3].Value;
    string month = m.Groups[1].Value;
    string day = m.Groups[2].Value;

    //create dirs...
}

我一次又一次地去测试.NET正则表达式行为的网站是这个:http ://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx ,它向您展示在给定示例输入和正则表达式的情况下您将获得哪些组。

希望有帮助。

于 2013-09-12T20:25:58.850 回答
0

我会做这样的事情。我也在重命名文件,因为我希望我的文件名能够正确整理。

static void OrganizeFiles( DirectoryInfo src , DirectoryInfo tgt )
{
  foreach ( FileInfo file in src.EnumerateFiles("result*.xml") )
  {
    Match m = FileNamePatternRegex.Match( file.Name ) ;
    bool processed = false ;
    if ( m.Success)
    {
      string datetime = m.Groups["datetime"].Value ;
      DateTime resultDate ;
      bool parseSucceeded = DateTime.TryParseExact( datetime , "M_d_yyyy h_m_s tt" , CultureInfo.InvariantCulture , DateTimeStyles.AllowWhiteSpaces , out resultDate ) ;
      if ( parseSucceeded )
      {
        DirectoryInfo subDir = tgt.CreateSubdirectory( resultDate.ToString(  @"yyyy\MM\dd" ) ) ;
        string newName     = resultDate.ToString( "result.yyyy-MM-ddTHH:mm:ss.xml" ) ;
        string destination = Path.Combine( subDir.FullName , newName ) ;
        file.MoveTo( destination ) ;
        processed = true ;
      }
    }
    if ( !processed )
    {
      Console.WriteLine( "skipping file {0}" , file.FullName ) ;
    }
  }
  return ;
}
const string          FileNamePattern      = @"^result(?<datetime>\d+_\d+_\d+ +\d+_\d+_\d+ +(am|pm))\.xml" ;
static readonly Regex FileNamePatternRegex = new Regex( FileNamePattern , RegexOptions.IgnoreCase|RegexOptions.ExplicitCapture ) ;
于 2013-09-12T22:24:32.957 回答