using System.Collections.Generic;
using System.Text.RegularExpressions;
public static void Main()
var macro = "[0], buy [1:all] from [2:counter]";
var expressionMatch = @"\[(?<index>\d):?(?<value>[\w\s]*)?\]";
var argumentsString = String.Empty;
case 1: argumentsString = "r gem floor"; break;
case 2: argumentsString = "r gem"; break;
case 3: argumentsString = "r floor"; break;
case 4: argumentsString = "r"; break;
var regex = new Regex(expressionMatch, RegexOptions.Compiled);
var matchCollection = regex.Matches(macro);
Console.WriteLine("Matches found: {0}", matchCollection.Count);
foreach (Match match in matchCollection)
GroupCollection groups = match.Groups;
Console.WriteLine("'{0}', (optional: '{1}') repeated at positions {2} and {3}",
var values = new Dictionary<int, string>();
foreach (Match match in matchCollection)
var groups = match.Groups;
var index = int.Parse(groups["index"].Value);
var defaultValue = groups["value"].Value;
if (!String.IsNullOrWhiteSpace(defaultValue))
values.Add(index, defaultValue);
var arguments = argumentsString.Split(' ');
for (int i = 0; i < arguments.Length; i++)
var argument = arguments[i];
if (!String.IsNullOrWhiteSpace(argument))
foreach(var kvp in values.OrderBy(kvp => kvp.Key))
Console.WriteLine("Param [{0}]: {1}", kvp.Key, kvp.Value);
var command = Regex.Replace(macro, expressionMatch, (Match match) => String.Format(@"{{{0}}}", match.Groups["index"].Value));
Console.WriteLine("Command format: {0}", command);
var parameters = values.OrderBy(kvp => kvp.Key).Select(kvp => kvp.Value).ToArray();
var execute = String.Format(command, parameters);
Console.WriteLine("Comamnd to execute: {0}", execute);