正则表达式返回引用月,日和年?

时间:2013-09-12 20:13:44

标签: c# regex

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

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

我知道这可以在没有正则表达式的情况下完成,但我选择以这种方式尝试学习它。我的输入字符串是文件名"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 个答案:

答案 0 :(得分:2)

您可以通过Match.Groups Property访问群组,通过Group.Value Property访问群组值。要将组值组合到路径中,可以使用Path.Combine Method。创建目录的Ant,可以使用Directory.CreateDirectory Method

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

答案 1 :(得分: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); 
} 

答案 2 :(得分: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,它会显示给定样本输入和正则表达式的组合。

希望有所帮助。

答案 3 :(得分: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 ) ;