This C# code fragment illustrates how to use the RegEx Captures collection within RegEx Groups.

I needed the ability to read all files in a directory, and build a CSV to cross reference the PO number to the EDI file it was in.

            //Pattern we want, but then escape all the ^ signs  "REF^BM^(\d*)~";
            string strRegExPattern856 = @"REF^BM^(\d*)~".Replace("^", @"\^");

public static void parseFile(string strDirectoryName, string filemask, string prefix, 
                             string filetype, string strRegExPattern, 
                             StreamWriter objFileSW, int maxDaysBack)
{
		string[] filenameArray = 
                  Directory.GetFiles(strDirectoryName, filemask, SearchOption.TopDirectoryOnly);

		foreach (string filename in filenameArray)
		{
			Console.WriteLine("Processing file=" + filename);
			string fileContents = File.ReadAllText(filename);

			foreach (Match m in Regex.Matches(fileContents, strRegExPattern))
			{
				//Console.WriteLine("'{0}' found at index {1}.",m.Value, m.Index);
				string showFilename = Path.GetFileName(filename);
				FileInfo fileInfo = new FileInfo(filename);
				TimeSpan daysBack = DateTime.Now.Subtract(fileInfo.LastWriteTime);
				
				if (daysBack.Days < maxDaysBack)
				{

					//Worthless Capture collection! 
					/*
					foreach (Capture capture in m.Captures)
					{
					   Console.WriteLine("Index={0}, Value={1}", capture.Index, capture.Value);
					}
					*/

					int loopCounter = 0;
					foreach (Group grp in m.Groups)
					{

						loopCounter++;
						if (loopCounter == 2)  // trying to avoid subscript error 
						{
							string PONum = grp.Captures[0].Value;
							Console.WriteLine(loopCounter + " " + showFilename + " " + PONum);
							string outline = prefix + "," +
                                                                filetype + "," + 
                                                                showFilename + "," + 
                                                                fileInfo.LastWriteTime +
                                                                "," + PONum;
							objFileSW.WriteLine(outline);
						}
					}
				}
				else
				{
					Console.WriteLine("Skipping file " + showFilename + " Created=" + 
                                                          fileInfo.CreationTime + 
                                                          " Over " + maxDaysBack + " Days Ago"); 
				}

			}  // end foreach 

	}
} 


Filed under: C#