我正在使用正则表达式语句来匹配文件名中的日期。我想将输出分成几组(我的声明就是这样)。
到目前为止,我已经测试了输出,但我似乎无法将我的组值传递给字符串,以便我可以使用它们创建目录。事实上,我似乎无法获得我的团队价值观。
我知道这可以在没有正则表达式的情况下完成,但我选择以这种方式尝试学习它。我的输入字符串是文件名"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)
}
}
}
答案 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 ) ;