How can I take the string foo[]=1&foo[]=5&foo[]=2 and return a collection with the values 1,5,2 in that order. I am looking for an answer using         
        
Here's an alternative solution using the built-in string.Split function:
string x = "foo[]=1&foo[]=5&foo[]=2";
string[] separator = new string[2] { "foo[]=", "&" };
string[] vals = x.Split(separator, StringSplitOptions.RemoveEmptyEntries);
Assuming you're dealing with numbers this pattern should match:
/=(\d+)&?/
In C# you can use capturing groups
    private void RegexTest()
    {
        String input = "foo[]=1&foo[]=5&foo[]=2";
        String pattern = @"foo\[\]=(\d+)";
        Regex regex = new Regex(pattern);
        foreach (Match match in regex.Matches(input))
        {
            Console.Out.WriteLine(match.Groups[1]);
        }
    }
Use the Regex.Split() method with an appropriate regex. This will split on parts of the string that match the regular expression and return the results as a string[].
Assuming you want all the values in your querystring without checking if they're numeric, (and without just matching on names like foo[]) you could use this: "&?[^&=]+="
string[] values = Regex.Split(“foo[]=1&foo[]=5&foo[]=2”, "&?[^&=]+=");
Incidentally, if you're playing with regular expressions the site http://gskinner.com/RegExr/ is fantastic (I'm just a fan).
Just make sure to escape the ampersand like so:
/=(\d+)\&/
I'd use this particular pattern:
string re = @"foo\[\]=(?<value>\d+)";
So something like (not tested):
Regex reValues = new Regex(re,RegexOptions.Compiled);
List<integer> values = new List<integer>();
foreach (Match m in reValues.Matches(...putInputStringHere...)
{
   values.Add((int) m.Groups("value").Value);
}